two - listas en java netbeans
Java 2D ArrayList y clasificación (3)
Necesito ordenar una lista de compras por el pasillo donde se encuentra el artículo, por ejemplo:
[Pan] [1]
[Leche] [2]
[Cereal] [3]
Estoy planeando hacer esto con ArrayList y me preguntaba cómo hacer una pregunta de la bonificación 2D ArrayList: ¿alguna idea sobre cómo ordenar por el número del pasillo?
¿No tienes una clase que contiene tu información de elemento + pasillo? Algo como:
public class Item {
private String name;
private int aisle;
// constructor + getters + setters
}
Si no lo hace, considere la posibilidad de crear uno: definitivamente es un mejor enfoque que intentar incluir esos atributos en ArrayList dentro de otra ArrayList. Una vez que tenga dicha clase, tendrá que escribir un Comparador para sus objetos o hacer que el ''Artículo'' sea comparable por sí mismo:
public class Item implements Comparable<Item> {
.. same stuff as above...
public int compareTo(Item other) {
return this.getAisle() - other.getAisle();
}
}
Entonces todo lo que haces es invocar el género:
List<Item> items = new ArrayList<Item>();
... populate the list ...
Collections.sort(items);
Si desea ordenar un ArrayList de ArrayLists, puede usar ColumnComparator .
Si desea ordenar una Lista de Arreglos de su Objeto personalizado, puede usar BeanComparator .
Sé que la pregunta fue hecha hace mucho tiempo, pero en realidad tuve el mismo problema. Si no sabe cuántas variables tendría en la lista, pero este no es un número grande, podría implementar el comparador para cada opción. p.ej
Tengo ArrayList<ArrayList<Object>>
y quiero ordenarlo por columnas y sé que la lista anidada consiste en una cantidad variable de objetos que puedo implementar como comparador para cada valor posible:
public class SecondColumnComparator implements Comparator {
public static boolean isNumeric(String str) {
try {
Integer integer = Integer.parseInt(str);
} catch (NumberFormatException nfe) {
return false;
}
return true;
}
@Override
public int compare(Object o1, Object o2) {
if (isNumeric(((ArrayList<String>) o1).get(1))) {
Integer firstInteger = Integer.parseInt(((ArrayList<String>) o1).get(1));
Integer secondInteger = Integer.parseInt(((ArrayList<String>) o2).get(1));
return firstInteger.compareTo(secondInteger);
}
if (((ArrayList<Object>) o1).get(1) instanceof String) {
String firstString = ((ArrayList<String>) o1).get(1);
String secondString = ((ArrayList<String>) o2).get(1);
return firstString.compareTo(secondString);
}
throw new Exception();
}
}
Y llámalo de esta manera:
switch (valueSelected) {
case 0:
Collections.sort(this.listOfLists, new FirstColumnComparator());
break;
case 1:
Collections.sort(this.listOfLists, new SecondColumnComparator());
break;
case 2:
Collections.sort(this.listOfLists, new ThirdColumnComparator());
break;
case 3:
Collections.sort(this.listOfLists, new FourthColumnComparator());
break;
default:
}
En cada comparador solo modifica .get(x)
donde x es el número de columna por el que desea ordenar.
El boolean isNumeric(String str);
función puede ser utilizada porque no puede almacenar diferentes tipos de objetos en una lista, así que pongo el reconocimiento de esto en el comparador y analizo String en cualquier otro tipo.
Recuerde que este comparator
y sus "cálculos" se llaman a cada comparación hecha por algoritmo, por lo que es extremadamente ineficiente ... A pesar de esto, esto es una especie de solución.