Cómo ordenar Listado de matriz por dos campos

Beto :

Tengo Lista de matriz doble y me gustaría tipo de acuerdo con el primero y último campo. Hasta ahora soy capaz de solucionar el problema sólo en un 1 elemento de la matriz.

Inmobiliaria:

0         1         2
-------  -------  -------
78       100        0
78       100        1
0        100        0
104      100        1

Esperado:

0         1         2
-------  -------  -------
0        100       0
78       100       1
78       100       0
101      100       1

Quiero ordenar campo de acuerdo con el valor del primero elemento de la matriz. Si el valor de la primera y segunda son iguales Quiero clasificar de acuerdo a tercera elemento en el primero debe ser 1 y 0 (sólo habrá 1 y valor 0)

List<Double[]> splitList = new ArrayList<>();
Double[] tmp1 = { 78d, 100d, 0d };
Double[] tmp2 = { 78d, 100d, 1d };
Double[] tmp3 = { 0d, 100d, 0d };
Double[] tmp4 = { 104d, 100d, 1d };
splitList.add(tmp1);
splitList.add(tmp2);
splitList.add(tmp3);
splitList.add(tmp4);
splitList.sort(Comparator.comparingDouble(a -> a[0]));

Éste género mí según primer elemento. He encontrado solución para ordenar por dos elementos https://stackoverflow.com/a/26865122/9774735 así que lo intenté:

splitList.sort(Comparator.comparingDouble(a -> a[0]).thenComparingDouble(b -> b[2]));

y salida de mí un error:

Multiple markers at this line
    - The type of the expression must be an array type but it resolved 
     to Object
    - The type of the expression must be an array type but it resolved 

¿Cómo puedo comparar Lista de matriz?

Lino:

Parece que el compilador Java tiene problemas en infering tipo genérico, usted tiene algunas opciones para superar este problema:

  1. Utilización de sugerencias de tipo con el patrón Class.<GenericType>.method(Arguments):

    splitList.sort(Comparator.<Double[]>comparingDouble(a -> a[0]).thenComparingDouble(b -> b[2]));
    
  2. Declarar el tipo de parámetro lambda (declarando que por primera parece ser suficiente):

    splitList.sort(Comparator.comparingDouble((Double[] a) -> a[0]).thenComparingDouble(b -> b[2]));
    

Después de leer sus comentarios que desee invertir la última comparación, lo cual puede hacerse de esta manera:

Comparator.<Double[]>comparingDouble(a -> a[0])
   .thenComparing(Comparator.<Double[]>comparingDouble(b -> b[2]).reversed())

Que es bastante complicado, es mejor de usar algo como esto:

splitList.sort((a, b) -> {
    int c = Double.compare(a[0], b[0]);
    return c == 0 ? Double.compare(b[2], a[2]) : c;
});

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=223283&siteId=1
Recomendado
Clasificación