JavaでArrayList<String[]>
をソートする最良の方法は何ですか?
ここで、String []は...
String[] = new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" };
次に、ArrayList全体をString []の2番目の値(インデックス1)で並べ替えます。すべてのString []をループしてから、インデックス1の子をループする必要があります。
何か案は?
編集済み
もっと説明があります。実際にいくつかのXMLファイルから学校を取得しており、XMLのすべてのノードには7つの属性があります。現在、XMLからこれらの学校のノードを保持しているString []のArrayListを作成しています。String[]配列自体が特定のノードの属性を保持しています。
これで、並べ替えの方法は、XMLの2番目の属性であるState of schoolに従って並べ替え、ArrayList内のString []のインデックス1にする必要があります。
最初にすべての学校(XMLのノード、JavaのString [])をループし、次にState(XMLのState属性、JavaのString [1])をフィルターする必要があります。
もう分かりましたか?
Collections.sort、カスタムコンパレータを使用するもの から始めます。これについても、カスタム Comparator を記述する必要があります。
たとえば、compareToメソッドで定義されている文字列の自然な順序に依存したいと仮定します。
public static void main(String[] args) throws Exception {
ArrayList<String[]> listOfStringArrays = new ArrayList<String[]>();
listOfStringArrays.add(new String[] {"x","y","z"});
listOfStringArrays.add(new String[] {"a","b","c"});
listOfStringArrays.add(new String[] {"m","n","o"});
Collections.sort(listOfStringArrays,new Comparator<String[]>() {
public int compare(String[] strings, String[] otherStrings) {
return strings[1].compareTo(otherStrings[1]);
}
});
for (String[] sa : listOfStringArrays) {
System.out.println(Arrays.toString(sa));
}
/* prints out
[a, b, c]
[m, n, o]
[x, y, z]
*/
}
次のように_Comparator<String[]>
_を作成します。
_new Comparator<String[]>() {
public int compare(String[] first, String[] second) {
return first[1].compareTo(second[1]);
}
}
_
次に、それをCollections.sort()
に渡します。
2番目の要素が実際に配列に存在するかどうかを確認したい場合があります。標準の文字列比較では不十分な場合は、カスタム比較を行うこともできます。
正しい子によって2つの_String[]
_を比較するComparator
を記述し、それをCollections.sort(List<T> list, Comparator<? super T> c)
に渡します。
あなたの編集に基づく:あなたのString []はあなたの属性を含むSchoolオブジェクトでなければなりません。 SchoolオブジェクトにComparableを実装すると、Collections.sort()を使用して簡単にソートできるようになります。
TreeSetまたはTreeMapを使用 http://download.Oracle.com/javase/6/docs/api/Java/util/TreeSet.html
これは、Java 8.で非常に簡単に実行できます。次のように記述します。
list.sort(Comparator.comparing(a -> a[1]));
たとえば、次のコード:
List<String[]> list = Arrays.asList(
new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" },
new String[] { "xyz", "xyz", "xyz", "xyz", "xyz", "xyz", "xyz" },
new String[] { "fgh", "fgh", "fgh", "fgh", "fgh", "fgh", "fgh" });
list.sort(Comparator.comparing(a -> a[1]));
list.stream().map(Arrays::toString).forEach(System.out::println);
必要な結果が得られます:
[abc, abc, abc, abc, abc, abc, abc]
[fgh, fgh, fgh, fgh, fgh, fgh, fgh]
[xyz, xyz, xyz, xyz, xyz, xyz, xyz]
配列のリストがあるとします[["x", "y","z"], ["a", "b", "c"], ["m", "n", "o"]]
Collections.sort()の代わりにlist.sort()を使用できます。
並べ替えには、ラムダとメソッド参照を使用したよりクリーンな方法を採用できます。
ラムダを使用する:
listOfStrings.sort((a, b)->a[1].compareTo(b[1]));
メソッド参照の使用:
listOfStrings.sort(Comparator.comparing(a->a[1]));
出力:
[a, b, c]
[m, n, o]
[x, y, z]