Java: Ordenación de una matriz basada en otra matriz con el método indexOf

chakwok:

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)]));
Eran :

Parece que espera indexOrder.indexOf(s)ser siempre igual a s(ya que su Listfue inicializado a [0, 1, 2, 3], donde el índice de ses s).

Si bien esto es cierto en el original indexOrder List, esto ya no ocurre cuando Collections.sortse inicia intercambiando elementos de su List.

Con el fin de no depender de la ordenación de indexOrdertiempo 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)]));

Supongo que te gusta

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