Quel est le meilleur moyen de trier un ArrayList<String[]>
en Java?
Où String [] est ...
String[] = new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" };
Maintenant, je veux trier la totalité de ArrayList par la 2ème valeur de String [] (à l'index 1). Je dois parcourir chaque chaîne [], puis son enfant à l'index 1.
Des idées?
ÉDITÉ
J'ai plus de description. Je reçois en fait des écoles à partir d’un fichier XML et chaque nœud XML a 7 attributs. Maintenant, je crée une ArrayList of String [] qui contient ces nœuds d'école à partir de XML et le tableau String [] lui-même contient les attributs d'un nœud particulier.
Maintenant, comme je veux le trier, il doit trier selon l’état de l’école qui est le 2e attribut en XML et l’index 1 dans String [] dans ArrayList.
Je dois d'abord parcourir chaque école en premier (nœud en XML, String [] en Java), puis filtrer State (attribut State en XML, String [1] en Java).
Est-ce clair maintenant?
Commencez avec Collections.sort, celui qui prend un comparateur personnalisé . Vous aurez besoin d'écrire un comparatif Comparateur pour cela également.
Par exemple, supposons que vous souhaitiez vous fier à l'ordre naturel des chaînes, défini dans leur méthode 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]
*/
}
Vous créez un Comparator<String[]>
comme ceci:
new Comparator<String[]>() {
public int compare(String[] first, String[] second) {
return first[1].compareTo(second[1]);
}
}
puis passez-le à Collections.sort()
.
Vous voudrez peut-être vérifier si le deuxième élément est réellement présent dans le tableau. Vous pouvez également effectuer une comparaison personnalisée si la comparaison standard de chaînes ne suffit pas.
Vous écrivez une Comparator
qui compare deux String[]
avec le bon enfant, puis vous le transmettez à Collections.sort(List<T> list, Comparator<? super T> c)
.
En fonction de votre modification: Votre chaîne [] doit être un objet School contenant vos attributs. Faites en sorte que votre objet School implémente Comparable et que cela facilite le tri avec Collections.sort ().
Utilisez TreeSet ou TreeMap http://download.Oracle.com/javase/6/docs/api/Java/util/TreeSet.html
C'est extrêmement facile à faire avec Java 8. Il suffit d'écrire:
list.sort(Comparator.comparing(a -> a[1]));
Par exemple, le code suivant:
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);
Donnera le résultat souhaité:
[abc, abc, abc, abc, abc, abc, abc]
[fgh, fgh, fgh, fgh, fgh, fgh, fgh]
[xyz, xyz, xyz, xyz, xyz, xyz, xyz]