Quiero iterar a través de dos matrices (A, B) basándose en el orden ordenada de otra matriz (índices), que es 10, 34, 32, 21 en este caso.
String[] A: a, b, c, d
String[] B: e, f, g, h
int[] indexes: 10, 34, 32, 21
Disculpa por el mal ejemplo aquí. He actualizado la matriz de índices para aclarar la confusión.
De entrada y salida esperada
La entrada son los tres arrays. Quería iterar a través de A, B, empleando la ordenada del conjunto de índices. es decir, quiero encontrar una manera de A iterate utilizando el orden (a, d, c, b) y iterate B utilizando el orden (e, h, g, f)
Mi acercamiento:
He resuelto el problema con una solución que creo que es idéntico a otro enfoque. Sin embargo, el segundo enfoque no funciona. Le agradecería si alguien puede explicar por qué no funciona como creo que me daría una mejor comprensión de cómo funciona Collections.sort en Java.
List<Integer> indexOrder = new ArrayList<>(indexes.length);
for (int i = 0; i < indexes.length; i++) {
indexOrder.add(i);
}
Collections.sort(indexOrder, Comparator.comparing((Integer s) -> indexes[s]));
Inspirado por este tema , he creado un ArrayList (preferiría no AList matriz) con el valor (1, 2, 3 ... indexes.length) y luego clasificarla utilizando un comparador con ref. a los índices. Los códigos anteriores funcionan como se esperaba.
Sin embargo, si cambio de los índices de [S] al final de la última línea de índices [indexOrder.indexOf (S)] . La clasificación va a dar un resultado erróneo. ¿Por qué es indexOf (s) dando un resultado diferente que si el índice s del ArrayList es lo mismo que su valor.
Collections.sort(indexOrder, Comparator.comparing((Integer s) -> indexes[indexOrder.indexOf(s)]));
Parece que espera indexOrder.indexOf(s)
ser siempre igual a s
(ya que su List
fue inicializado a [0, 1, 2, 3]
, donde el índice de s
es s
).
Si bien esto es cierto en el original indexOrder
List
, esto ya no ocurre cuando Collections.sort
se inicia intercambiando elementos de su List
.
Con el fin de no depender de la ordenación de indexOrder
tiempo que está ordenando, puede crear una copia de esa List
:
List<Integer> copy = new ArrayList<>(indexOrder);
Collections.sort(indexOrder, Comparator.comparing((Integer s) -> indexes[copy.indexOf(s)]));