Я знаю, что вопрос задавали давно, но на самом деле у меня была такая же проблема. Если вы не знаете, сколько переменных у вас будет в списке, но это не большое число, вы можете просто использовать компаратор для каждого выбора. например,
У меня есть ArrayList<ArrayList<Object>>
, и я хочу отсортировать его по столбцам, и я знаю, что вложенный список состоит из переменного числа объектов, я могу просто реализовать компаратор для каждого возможного значения:
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();
}
}
И назовите это так:
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:
}
В каждом компараторе просто измените .get(x)
, где x - номер столбца, по которому вы хотите отсортировать.
Функцию boolean isNumeric(String str);
можно использовать, потому что вы не можете хранить объекты разных типов в одном списке, поэтому я распознаю это для компаратора и разбираю String для любого другого типа.
Помните, что этот comparator
и его "расчеты" вызываются для каждого отдельного сравнения, сделанного алгоритмом, поэтому он крайне неэффективен ...
Несмотря на этот факт, это своего рода решение.