2011-09-06 2 views
5

私は.csvのファイルをExcelのスプレッドシートのように読み込んでいます。ファイルによって決まる特定の数の列があり、それぞれの行を.split(",")メソッドを使用して文字列配列に読み込みます。これを配列リストに入れて、特定のサイズを与えずにすべての文字列配列を保持できるようにします。しかし、Collections.sort()を使用して配列リストをソートすると、プログラムが壊れます。何が問題なの?String []配列の配列リストをソートする

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

「sortNum」はどこから来たのですか? –

+2

「休憩」とはどういう意味ですか?どこが壊れないの?どのようなエラーが出ますか?何が起こると思いますか?すべての行に 'sortNum' + 1個のセルがありますか? –

+0

'sortNum'とは何ですか? – guardianpt

答えて

5

2点:

  • しないでくださいで-1の比較を逆にするcompareの結果を掛けます。 Integer.MIN_VALUE * -1はまだInteger.MIN_VALUEです。代わりに、比較自体の順序を逆にしてください
  • 私の推測では、は実際にはに十分な列がない行があります。おそらくあなたはそれらを最後に置くべきでしょうか?

ような何か:

また
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; 
    } 
}); 

、すべての行は列が不足していること絶対にを確認するために、まず、あなたのリストをフィルタリングします。

+0

これは美しく機能しました。ありがとうございました – nathpilland

1

文字列[sortNum]またはotherStrings [sortNum]のいずれかが範囲外である可能性があります。あなたはそれを防ぐためにいくつかのチェックをする必要があります。また、文字列[sortNum]またはotherStrings [sortNum]はnullでもかまいません。私はあなたがこれら2つの事のうちの1つにぶつかっていると思う。コールスタックは何を示していますか?

0

'sortNum'変数を参照してクロージャーの問題が発生している可能性があります。いくつかのガイダンスについては、Jon Skeet's closure articleを参照してください。ただし、C#のクロージャについては関連性があります。この問題がない場合でも、それは良い読書です。 :)

0

あなたは空の "セル" のデフォルト値を提供することができます。

  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

コンストラクタでこの

ファーストクラスのコンパレータを使用してみてください:

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])); 
     } 
} 

とあなたのコードに

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

あなたのために働く希望

0

誰かが複数の列に並べ替えを行う必要がある場合に備えてコードを共有する。

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));