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?
Parece que el compilador Java tiene problemas en infering tipo genérico, usted tiene algunas opciones para superar este problema:
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]));
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;
});