2011-01-15 5 views
12

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

Где String [] является ...

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

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

Любые идеи?

EDITED


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

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

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

Теперь ясно?

+3

Я не вижу никакого ArrayList в любом месте, и все в строке массив идентичен ... – BoltClock

+1

Пожалуйста, попробуйте объяснить это немного дальше, разместите некоторые входные параметры и исключенные результаты. – Crozin

ответ

28

Начать с Collections.sort, the one that takes a custom Comparator. Для этого вам также понадобится написать таможню 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] 
     */ 

    } 
3

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

4

Вы создаете Comparator<String[]> так:

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

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

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

+0

Я думаю, как он будет сортировать весь ArrayList государством в порядке возрастания? – Neutralizer

+1

Это было бы в порядке возрастания, как мы с Йорном представили его. если вы хотите его в другом порядке, то вы можете либо отменить значение, возвращаемое из String.compareTo (String), либо просто вызвать Collections.reverse (yourList) после того, как вы отсортировали первый раз. – whaley

0

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

0

Это очень легко сделать с 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]