Подтвердить что ты не робот

Сортировка 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).

Теперь ясно?

4b9b3361

Ответ 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).

Ответ 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]