Tengo un problema al ordenar una lista de matrices. En una clase tengo dos Array Lists de diferentes objetos, podemos llamar a los objetos Foo y Bar.
public class Foo() {
int value;
//Some other fields, and setters and getters.
}
public class Bar() {
int id;
//Same here...
}
Entonces, la lista fooList puede estar totalmente revuelta. Digamos que tengo 16 Foos, pero Foo con valor 5 puede estar en el índice 13 y así sucesivamente.
Lo que estoy tratando de hacer es ordenar barList para que coincida con fooList después de estos valores. Si Foo con valor 5 está en el índice 13, quiero que Bar con valor 5 esté en el índice 13. Mi último intento fue este, pero sin éxito.
HashMap<Integer, Integer> positions = new HashMap<>();
for(int i=0;i<fooList.size();i++){
positions.put(foo.get(i).getValue, i);
}
Collections.sort(barList, new Comparator<Bar>(){
public int compare(Bar obj1, Bar obj2){
return positions.get(barList.indexOf(obj1)) -
positions.get(barList.indexOf(obj2));
}
});
¿Alguien tiene idea de cómo hacer esto de una manera eficiente?
No estoy seguro de por qué está utilizando el índice de un elemento barList
para buscar en el mapa positions
.
Esto debería ayudarte
Collections.sort(barList, new Comparator<Bar>() {
@Override
public int compare(Bar o1, Bar o2) {
return positions.get(o1.getId()) - positions.get(o2.getId());
}
});
Esto se puede simplificar con una sola línea.
Collections.sort(barList, Comparator.comparingInt(bar -> positions.get(bar.getId())));
Básicamente, el problema se reduce a esto:
Dadas dos listas de números enteros A = {a 1 , a 2 ... a n } y B = {b 1 , b 2 , ... b m }, ordena la lista B según la posición de ocurrencia del elemento en la primera lista, A.
Para dos elementos x , y en B
Entonces, la función de comparación para Bar
tiene que comparar la posición en la que ha aparecido un elemento en particular Foo
(según lo anterior).
NOTA: Esto supone (como ha dicho) que no hay ningún elemento en Bar
que no esté allí Foo
. (Los elementos de Bar
son un subconjunto de los elementos de Foo
).
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras