2011-09-06 9 views
5

Je lis un fichier .csv comme une feuille de calcul dans Excel. Il y a un certain nombre de colonnes, déterminées par le fichier, et je lis chaque ligne dans un tableau de chaînes en utilisant la méthode .split(","). J'ai ensuite mis ceci dans une liste de tableau afin qu'il puisse contenir toutes les chaînes de caractères sans lui donner une taille spécifique. Cependant, quand je vais trier la liste de tableau en utilisant Collections.sort(), le programme se brise. Quel pourrait être le problème? Voici mon code pour trier:Tri d'une liste de tableaux de chaînes []

Collections.sort(stringList, new Comparator <String[]>() { 
    public int compare(String[] strings, String[] otherStrings) { 
     return -1 * (strings[sortNum].compareTo(otherStrings[sortNum])); 
    } 
}); 
+1

D'où provient 'sortNum'? –

+2

Que voulez-vous dire par «pauses»? Où ne se brise-t-il pas? Quelle erreur obtenez-vous? Qu'espériez-vous arriver? Est-ce que chaque rangée a 'sortNum' + 1 cells? –

+0

Qu'est-ce que 'sortNum'? – guardianpt

Répondre

5

Deux points:

  • Ne pas multiplier le résultat de compare par -1 pour inverser une comparaison. Integer.MIN_VALUE * -1 est toujours Integer.MIN_VALUE. Au lieu de cela, inverser l'ordre de la comparaison elle-même
  • Je suppose que vous avez effectivement a obtenu quelques lignes sans assez de colonnes. Peut-être devriez-vous les mettre à la fin?

Quelque chose comme:

Collections.sort(stringList, new Comparator <String[]>() { 
    public int compare(String[] x1, String[] x2) { 
     if (x1.length > sortNum && x2.length > sortNum) { 
      return x2[sortNum].compareTo(x1[sortNum]); 
     } 
     if (x1.length > sortNum) { 
      return 1; 
     } 
     if (x2.length > sortNum) { 
      return -1; 
     } 
     return x2.length - x1.length; 
    } 
}); 

Vous pouvez également filtrer votre liste d'abord à faire absolument vous que toutes les lignes ont assez de colonnes.

+0

Cela a fonctionné magnifiquement. Je vous remercie – nathpilland

1

Eh bien, que ce soit des chaînes [sortNum] ou otherStrings [sortNum] pourrait être hors limites. Vous devez faire des vérifications pour éviter cela. De plus, les chaînes [sortNum] ou otherStrings [sortNum] peuvent être nulles. Je parie que vous courez dans l'une de ces 2 choses. Qu'est-ce que la pile d'appel indique?

0

Je suppose que vous pourriez avoir un problème de fermeture en référence à la variable 'sortNum'. Voir Jon Skeet's closure article pour quelques conseils, même si elle traite des fermetures en C# il devrait toujours être pertinent. Même si vous n'avez pas ce problème, c'est une bonne lecture. :)

0

vous pouvez fournir des valeurs par défaut pour "cellules" vides:

  public int compare(String[] strings, String[] otherStrings) { 
       String one, other; 
       one = other = ""; // default value 
       if (sortNum<strings.length && strings[sortNum] != null) { 
        one = strings[sortNum]; 
       } 
       if (sortNum<otherStrings.length && otherStrings[sortNum] != null) { 
        other = otherStrings[sortNum]; 
       } 
       return -1 * (one.compareTo(other)); 
      } 
1

Essayez d'utiliser cette

d'abord votre comparateur de classe avec un constructeur:

public class MyStringArrayComparator implements Comparator<String[]>{ 

     Integer sortNum; 

     public MyStringComparator(Integer index) { 
       sortNum = index; 
     } 

     @Override 
     public int compare(String[] strings, String[] otherStrings) { 
       return -1*(strings[sortNum].compareTo(otherStrings[sortNum])); 
     } 
} 

et dans votre code

Collections.sort(stringList,new MyStringArrayComparator<String[]>(index)); 

Espérons que cela fonctionne pour vous

0

Partage de code au cas où quelqu'un aurait besoin de faire le tri sur plusieurs colonnes.

public final class ArrayComparatorWithIndex<T extends Comparable<T>> implements Comparator<T[]> 
{ 
    private final int[] indexToSort; 

    public ArrayComparatorWitIndex(int[] indexToSort) 
    {   
     if(indexToSort == null || indexToSort.length == 0){ 
      throw new IllegalArgumentException("Index to use for sorting cannot be null or empty."); 
     } 
     this.indexToSort = indexToSort; 
    } 

    @Override 
    public int compare(T[] str, T[] otherStr) 
    { 
     int result= 0; 
     for (int index : indexToSort) 
     { 
      result= str[index].compareTo(otherStr[index]); 
      if (result != 0){ 
       break; 
      } 
     } 
     return result; 
    } 
} 

//Example how to use it: 
int[] indexForSorting= new int[] { 1, 3 }; 
Collections.sort(stringList, new ArrayComparator<String>(indexForSorting));