web-dev-qa-db-fra.com

Trier ArrayList of Array en Java

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?

12
Neutralizer

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]
        */ 

    }
29
whaley

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.

4
Jorn

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

3
Paul Tomblin

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 ().

0
jzd
0
Navi

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]
0
Lukas Eder