Сортировка ArrayList массива в Java
Каков наилучший способ сортировки ArrayList<String[]>
в Java?
Где String []...
String[] = new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" };
Теперь я хочу отсортировать весь ArrayList по 2-ому значению String [] (по индексу 1). Мне нужно прокрутить каждую строку [], а затем ее дочерний элемент в индексе 1.
Любые идеи?
отредактированы
У меня есть больше описания. Я фактически получаю школы из какого-либо XML файла, и каждый node в XML имеет 7 атрибутов. Теперь я создаю ArrayList из String [], в котором хранятся те узлы школы из массива XML и String [], которые содержат атрибуты определенного node.
Теперь, как я хочу его сортировать, он должен сортироваться в соответствии с состоянием школы, которое является вторым атрибутом в XML и индексом 1 в String [] внутри ArrayList.
Мне нужно сначала прокрутить каждую Школу (node в XML, String [] в Java), а затем мне придется фильтровать State (атрибут State в XML, String [1] в Java).
Теперь ясно?
Ответы
Ответ 1
Начните с Collections.sort, тот, который берет пользовательский Компаратор. Для этого вам также потребуется написать Comparator.
Например, если вы хотите полагаться на естественный порядок строк, как определено в методе compareTo:
public static void main(String[] args) throws Exception {
ArrayList<String[]> listOfStringArrays = new ArrayList<String[]>();
listOfStringArrays.add(new String[] {"x","y","z"});
listOfStringArrays.add(new String[] {"a","b","c"});
listOfStringArrays.add(new String[] {"m","n","o"});
Collections.sort(listOfStringArrays,new Comparator<String[]>() {
public int compare(String[] strings, String[] otherStrings) {
return strings[1].compareTo(otherStrings[1]);
}
});
for (String[] sa : listOfStringArrays) {
System.out.println(Arrays.toString(sa));
}
/* prints out
[a, b, c]
[m, n, o]
[x, y, z]
*/
}
Ответ 2
Вы создаете Comparator<String[]>
следующим образом:
new Comparator<String[]>() {
public int compare(String[] first, String[] second) {
return first[1].compareTo(second[1]);
}
}
затем передайте его на Collections.sort()
.
Возможно, вы захотите выполнить некоторую проверку, действительно ли второй элемент присутствует в массиве. Вы также можете выполнить произвольное сравнение, если стандартного сравнения строк недостаточно.
Ответ 3
Вы пишете Comparator
, который сравнивает два String[]
с правильным дочерним элементом, а затем передает его на Collections.sort(List<T> list,
Comparator<? super T> c)
.
Ответ 4
Использовать TreeSet или TreeMap http://download.oracle.com/javase/6/docs/api/java/util/TreeSet.html
Ответ 5
На основе вашего редактирования: ваша строка [] должна быть объектом School, чтобы содержать ваши атрибуты. Сделайте свой объект School Comparible сопоставимым, и это позволит легко сортировать с помощью Collections.sort().
Ответ 6
Это очень легко сделать с Java 8. Просто напишите:
list.sort(Comparator.comparing(a -> a[1]));
Например, следующий код:
List<String[]> list = Arrays.asList(
new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" },
new String[] { "xyz", "xyz", "xyz", "xyz", "xyz", "xyz", "xyz" },
new String[] { "fgh", "fgh", "fgh", "fgh", "fgh", "fgh", "fgh" });
list.sort(Comparator.comparing(a -> a[1]));
list.stream().map(Arrays::toString).forEach(System.out::println);
Выдает желаемый результат:
[abc, abc, abc, abc, abc, abc, abc]
[fgh, fgh, fgh, fgh, fgh, fgh, fgh]
[xyz, xyz, xyz, xyz, xyz, xyz, xyz]