Сортировать ArrayList из Array в Java - PullRequest
12 голосов
/ 15 января 2011

Каков наилучший способ сортировки ArrayList<String[]> в Java?

Где String [] - это ...

String[] = new String[] { "abc", "abc", "abc", "abc", "abc", "abc", "abc" };

Теперь я хочу отсортировать весь ArrayList по 2-музначение String [] (по индексу 1).Мне нужно перебрать все строки [] и затем его дочерний элемент с индексом 1.

Есть идеи?

РЕДАКТИРОВАНИЕ


У меня есть еще описание.Я на самом деле получаю школы из какого-то XML-файла, и каждый узел в XML имеет 7 атрибутов.Теперь я создаю ArrayList из String [], который содержит эти школьные узлы из XML, а сам массив String [] содержит атрибуты определенного узла.

Теперь, как я хочу это отсортировать, он долженсортировать по состоянию школы, которое является вторым атрибутом в XML и индексом 1 в String [] внутри ArrayList.

Мне нужно сначала пройтись по каждой школе (узел в XML, String [] в Java), а затем мне нужно будет отфильтровать State (атрибут State в XML, String [1] в Java).

Понятно ли сейчас?

Ответы [ 6 ]

29 голосов
/ 15 января 2011

Начните с Collections.sort, который использует собственный компаратор . Для этого вам также потребуется написать собственный компаратор .

Например, предполагая, что вы хотите полагаться на естественное упорядочение строк, как определено в их методе 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]
        */ 

    }
4 голосов
/ 15 января 2011

Вы создаете Comparator<String[]> примерно так:

new Comparator<String[]>() {
  public int compare(String[] first, String[] second) {
    return first[1].compareTo(second[1]);
  }
}

затем передайте его Collections.sort().

Возможно, вы захотите проверить, присутствует ли второй элемент в массиве. Вы также можете выполнить пользовательское сравнение, если стандартного сравнения строк недостаточно.

3 голосов
/ 15 января 2011

Вы пишете Comparator, который сравнивает два String[] по правильному потомку, а затем передаете его Collections.sort(List<T> list, Comparator<? super T> c).

0 голосов
/ 13 марта 2016

Это очень легко сделать с 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]
0 голосов
/ 15 января 2011

На основании ваших правок: ваша строка [] должна быть объектом School, чтобы содержать ваши атрибуты.Сделайте ваш объект School реализуемым Comparable, и это позволит легко сортировать с Collections.sort ().

0 голосов
/ 15 января 2011

Использовать TreeSet или TreeMap http://download.oracle.com/javase/6/docs/api/java/util/TreeSet.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...