2013-04-24 5 views
3

У меня есть ArrayList ArrayList строки.Сортировка ArrayList из Arraylist <String> в java

В Outer ArrayList для каждого индекса каждый Внутренний ArrayList имеет четыре элемента, которые имеют четыре параметра.

  1. Контакты Id
  2. Контакты Имя
  3. Контакты Адрес
  4. Контакты Номер

Теперь я хочу, чтобы отсортировать полный ArrayList из на основе Контактной Имя параметра.

Средство доступа к внешнему Arraylist и внутреннему ArrayList, присутствующему на каждом индексе внешнего Arraylist, должно быть отсортировано в соответствии с именем контакта.

Компаратор/сравнимые интерфейсы, которые вряд ли помогут мне.

Collection.sort не может помочь мне

Sorting Arraylist of Arraylist of Bean. Я прочитал этот пост, но это для ArrayList из ArrayList<Object>. Как выяснить эту проблему?

+0

Что вы подразумеваете под четырьмя параметрами в ArrayList? –

+0

Если ожидается, что в вашем списке внутренних массивов всегда есть четыре элемента, которые хорошо определены, введите класс с полями для «Идентификатор контактов, имя, адрес и номер» и «ArrayList» этого класса. – Steve

+0

@jlordo - Нет, у него есть список списков, а не 4 отдельных списка. –

ответ

16

Предполагая, что ваши списки в вашем списке есть строки в порядке идентификатор, имя, адрес и номер (т.е. имя с индексом 1), вы можете использовать Comparator следующим образом:

List<List<String>> list; 
Collections.sort(list, new Comparator<List<String>>() { 
    @Override 
    public int compare(List<String> a, List<String> b) { 
     return a.get(1).compareTo(b.get(1)); 
    } 
}); 

Кстати, важно не то, что вы используете ArrayList: Хорошая практика программирования для объявления переменных с использованием абстрактного типа, то есть List (как у меня в этом коде).

+0

сэр это работает .............. –

1

Компаратор/сравнимые интерфейсы не могут помочь, потому что у меня нет объектов.

Неверный. У вас есть объекты. Все вещи, которые вы пытаетесь отсортировать, - это объекты.

Если вы пытаетесь отсортировать объекты ArrayList<String> в ArrayList<ArrayList<String>>, вам необходимо ввести Comparator<ArrayList<String>>. (Сопоставимом подход является неправильным один для этой структуры данных. Вы должны были бы объявить пользовательский подкласс ArrayList ... и это гадость!)


Но, лучше бы представлять свои объекты с обычаем классы. В этом случае ваш ArrayList of String должен быть обычным классом Contact с 4 полями, геттерами и (если требуется) сеттерами. Затем вы заявляете, что применяете Comparable<Contact> и реализуете метод compareTo.


Другие ответы показывают, как реализовать компаратор на основе только одного поля списка. Этого может быть достаточно, но он даст вам порядок сортировки, где порядок пары разных «Джон Смит» будет неопределенным. (Я бы использовал второе поле в качестве тай-выключателя. Поле Id было бы идеальным, если идентификаторы уникальны.)

+0

Компаратор > Вы можете мне привести пример. –

+0

См. Ответ Арджуна Рао для простого примера, который сортирует только одно из полей ... –

+0

@spehen CI исправляет мое утверждение. Компаратор/сравнимые интерфейсы не могут помочь, потому что у меня нет объектов. Спасибо за то, что вы меня осознанный. –

0

Я думаю, что это случай, когда вы не рассматриваете коллекции как объекты первого класса. Создайте новый класс под названием «Контакт» вместо абстрагирования его как ArrayList и используйте Comparator.

1

Вы должны создать класс для своей структуры данных (если вы не можете, то укажите причину.Я не вижу особых оснований не):

public class Contact implements Comparable { 
    private String id; 
    private String name; 
    private String address; 
    private String number; 

    // Getters and setters, and compareTo. 
} 

Затем используйте, что в списке вместо:

List<Contact> contacts = new ArrayList<Contacts>(); 

Сортировка он будет тривиальным.

+0

Я взял на себя ответственность за сортировку. Я не могу изменить свой старший код. –

+3

Тогда дайте своим старшим удар в их заднице! Покажите им, что вы знаете лучше, и делайте это правильно;) – NilsH

+0

Вы - истинный Нилш. Но пока, пожалуйста, мне нужно какое-то решение. –

4

Мне плохо, что это сообщение, потому что List<Contact> будет намного лучше выбор. Нечто подобное было бы возможно, если бы:

ArrayList<ArrayList<String>> yourList = ... 
Collections.sort(yourList, new Comparator<ArrayList<String>>() { 
    @Override 
    public int compare(ArrayList<String> one, ArrayList<String> two) { 
     return one.get(1).compareTo(two.get(1)); 
    } 
}); 
1

Используйте следующий компаратор:

class MyComparator implements Comparator<ArrayList<String>> { 
    private static int indexToCompare = 1; 
    @Override 
    public int compare(ArrayList<String> o1, ArrayList<String> o2) { 
     return o1.get(indexToCompare).compareTo(o2.get(indexToCompare)); 
    } 

} 

Здесь indexToCompare является индекс ArrayList, который соответствует имени контакта. В вашем случае «1»

2
import java.util.Collections; 
    import java.util.Comparator; 
    import java.util.List; 


    public class ListsUtils { 

     public static void sortListOfLists(List < List <String>> listOfLists) { 

      // first sort the inner arrays using collections.sort 
      for (List <String> innerList: listOfLists) { 
       Collections.sort(innerList); 
      } 

      // now sort by comparing the first string of each inner list using a comparator 
      Collections.sort(listOfLists, new ListOfStringsComparator()); 
     } 

     static final class ListOfStringsComparator implements Comparator < List <String>> { 

      @ 
      Override 
      public int compare(List <String> o1, List <String> o2) { 
       // do other error checks here as well... such as null. outofbounds, etc 
       return o1.get(0).compareTo(o2.get(0)); 
      } 

     } 
    } 

Я думаю, я просто предположил, что вы должны были сортировать список строковых массивов ... вот почему я отсортированный список внутренних массивов, а затем сортировал внешний список, сравнивая 1-й элемент каждого массива. Не прочитал контакты, которые у вас были в вашем ответе.

В этом случае удалите цикл for для сортировки внутреннего списка, и вы все равно сможете отсортировать его с помощью компаратора, но сравните с правильным индексом вместо 1-го элемента.

Collections.sort (listOfLists, новый ListOfStringListComparator());

Смежные вопросы