2011-01-15 18 views
12

¿Cuál es la mejor manera de ordenar un ArrayList<String[]> en Java?Sort ArrayList of Array en Java

Dónde String [] es ...

String[] = new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" }; 

Ahora quiero para ordenar todo el ArrayList por segundo valor de String [] (en el índice 1). Necesito recorrer todas y cada cadena [] y luego su hijo en el índice 1.

¿Alguna idea?

EDITADO


tengo más descripción. De hecho, recibo escuelas de algún archivo XML y cada nodo en XML tiene 7 atributos. Ahora estoy creando un ArrayList of String [] que contiene esos nodos escolares de XML y String [] el array en sí mismo tiene los atributos de un nodo particular.

Ahora, la forma en que quiero ordenarlo es, debe ordenar de acuerdo con State of school, que es el segundo atributo en XML y el índice 1 en String [] dentro de ArrayList.

Necesito recorrer todas y cada una de las escuelas primero (nodo en XML, String [] en Java) y luego tendré que filtrar el estado (atributo State en XML, String [1] en Java).

¿Está claro ahora?

+3

No veo ninguna ArrayList en cualquier lugar, y todo en la cadena de array es idéntico ... – BoltClock

+1

Por favor intente explicarlo un poco más, publique algunos parámetros de entrada y resultados exceptuados. – Crozin

Respuesta

28

de inicio con Collections.sort, the one that takes a custom Comparator. Tendrá que escribir un Comparator personalizado para esto también.

Por ejemplo, asumiendo que usted quiere confiar en el orden natural de las cadenas como se define en su método 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] 
     */ 

    } 
3

Usted escribe un Comparator que compara dos String[] por el niño correcto, y luego lo pasa al Collections.sort(List<T> list, Comparator<? super T> c).

4

se crea un Comparator<String[]> así:

new Comparator<String[]>() { 
    public int compare(String[] first, String[] second) { 
    return first[1].compareTo(second[1]); 
    } 
} 

luego pasarlo a Collections.sort().

Es posible que desee comprobar si el segundo elemento está realmente presente en la matriz. También podría hacer una comparación personalizada si la comparación de cadenas estándar no es suficiente.

+0

¿Estoy pensando cómo ordenaría todo ArrayList por estado en orden ascendente? – Neutralizer

+1

Estaría en orden ascendente de la forma en que Jorn y yo lo presentamos. si lo desea en otro orden, puede negar el valor devuelto por String.compareTo (String) o simplemente llamar a Collections.reverse (yourList) después de haber ordenado la primera vez. – whaley

0

Según su edición: Your String [] debería ser un objeto de la Escuela para contener sus atributos. Haga que el objeto de su escuela implemente Comparable y eso permitirá una fácil ordenación con Collections.sort().

0

Esto es extremadamente fácil de hacer con Java 8.Sólo tiene que escribir:

list.sort(Comparator.comparing(a -> a[1])); 

Por ejemplo, el siguiente código:

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

rendirá el resultado deseado:

[abc, abc, abc, abc, abc, abc, abc] 
[fgh, fgh, fgh, fgh, fgh, fgh, fgh] 
[xyz, xyz, xyz, xyz, xyz, xyz, xyz]