Как я могу отсортировать список по алфавиту? - PullRequest
161 голосов
/ 02 апреля 2009

У меня есть List<String> объект, который содержит названия стран. Как отсортировать этот список по алфавиту?

Ответы [ 13 ]

193 голосов
/ 02 апреля 2009

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

 java.util.Collections.sort(listOfCountryNames)
137 голосов
/ 02 апреля 2009

Решение с коллекциями. Сортировка

Если вы вынуждены использовать этот список, или если ваша программа имеет структуру, подобную

  • Создать список
  • Добавить названия некоторых стран
  • отсортировать их один раз
  • никогда больше не меняйте этот список

тогда ответ Тилоса будет лучшим способом сделать это. Если вы объедините это с советом Тома Хоутина - tackline , вы получите:

java.util.Collections.sort(listOfCountryNames, Collator.getInstance());

Решение с TreeSet

Если вы можете принимать решение, и если ваше приложение может стать более сложным, вы можете изменить свой код, чтобы использовать вместо него TreeSet. Этот вид коллекции сортирует ваши записи только тогда, когда они вставлены. Нет необходимости вызывать sort ().

Collection<String> countryNames = 
    new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.

Примечание, почему я предпочитаю TreeSet

Это имеет некоторые тонкие, но важные преимущества:

  • Это просто короче. Только на одну строку короче.
  • Никогда не беспокойтесь о действительно ли этот список отсортирован прямо сейчас , потому что TreeSet всегда сортируется, независимо от того, что вы делаете.
  • Вы не можете иметь повторяющиеся записи. В зависимости от вашей ситуации это может быть за или против. Если вам нужны дубликаты, придерживайтесь своего списка.
  • Опытный программист смотрит на TreeSet<String> countyNames и мгновенно знает: это отсортированная коллекция строк без дубликатов, и я могу быть уверен, что это так в любой момент . Столько информации в короткой декларации.
  • Реальная производительность выигрывает в некоторых случаях. Если вы используете список и вставляете значения очень часто, и список может быть прочитан между этими вставками, то вам придется сортировать список после каждой вставки. Набор делает то же самое, но делает это намного быстрее.

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

Не поймите меня неправильно: использование Collections.sort не является ошибкой или недостатком. Но есть много случаев, когда TreeSet намного чище.

26 голосов
/ 15 марта 2013

Вы можете создать новую отсортированную копию, используя Java 8 Stream или Guava:

// Java 8 version
List<String> sortedNames = names.stream().sorted().collect(Collectors.toList());
// Guava version
List<String> sortedNames = Ordering.natural().sortedCopy(names); 

Другой вариант - сортировка на месте через API коллекций:

Collections.sort(names);
23 голосов
/ 14 сентября 2014

Лучше поздно, чем никогда! Вот как мы можем это сделать (только для целей обучения) -

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

class SoftDrink {
    String name;
    String color;
    int volume; 

    SoftDrink (String name, String color, int volume) {
        this.name = name;
        this.color = color;
        this.volume = volume;
    }
}

public class ListItemComparision {
    public static void main (String...arg) {
        List<SoftDrink> softDrinkList = new ArrayList<SoftDrink>() ;
        softDrinkList .add(new SoftDrink("Faygo", "ColorOne", 4));
        softDrinkList .add(new SoftDrink("Fanta",  "ColorTwo", 3));
        softDrinkList .add(new SoftDrink("Frooti", "ColorThree", 2));       
        softDrinkList .add(new SoftDrink("Freshie", "ColorFour", 1));

        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //use instanceof to verify the references are indeed of the type in question
                return ((SoftDrink)softDrinkOne).name
                        .compareTo(((SoftDrink)softDrinkTwo).name);
            }
        }); 
        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.name + " - " + sd.color + " - " + sd.volume);
        }
        Collections.sort(softDrinkList, new Comparator() {
            @Override
            public int compare(Object softDrinkOne, Object softDrinkTwo) {
                //comparision for primitive int uses compareTo of the wrapper Integer
                return(new Integer(((SoftDrink)softDrinkOne).volume))
                        .compareTo(((SoftDrink)softDrinkTwo).volume);
            }
        });

        for (SoftDrink sd : softDrinkList) {
            System.out.println(sd.volume + " - " + sd.color + " - " + sd.name);
        }   
    }
}
9 голосов
/ 02 апреля 2009

Используйте два аргумента для Collections.sort. Вам понадобится подходящий Comparator, который обрабатывает соответствующий случай (т. Е. Выполняет лексические операции, а не упорядочение по UTF16), например, который можно получить с помощью java.text.Collator.getInstance.

7 голосов
/ 21 мая 2015

Если вы не сортируете строки только на английском языке без акцента, вы, вероятно, захотите использовать Collator. Он будет правильно сортировать диакритические знаки, может игнорировать регистр и другие специфичные для языка вещи:

Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));

Вы можете установить прочность коллатера , см. Javadoc.

Вот пример для словацкого:

List<String> countries = Arrays.asList("Slovensko", "Švédsko", "Turecko");

Collections.sort(countries);
System.out.println(countries); // outputs [Slovensko, Turecko, Švédsko]

Collections.sort(countries, Collator.getInstance(new Locale("sk")));
System.out.println(countries); // outputs [Slovensko, Švédsko, Turecko]
5 голосов
/ 24 декабря 2015

Вот то, что вы ищете

listOfCountryNames.sort(String::compareToIgnoreCase)
4 голосов
/ 15 мая 2018

В одну строку, используя Java 8:

list.sort(Comparator.naturalOrder());
4 голосов
/ 30 июля 2015

Используя Collections.sort(), мы можем отсортировать список.

public class EmployeeList {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        List<String> empNames= new ArrayList<String>();

        empNames.add("sudheer");
        empNames.add("kumar");
        empNames.add("surendra");
        empNames.add("kb");

        if(!empNames.isEmpty()){

            for(String emp:empNames){

                System.out.println(emp);
            }

            Collections.sort(empNames);

            System.out.println(empNames);
        }
    }
}

Выход:

sudheer
kumar
surendra
kb
[kb, kumar, sudheer, surendra]
2 голосов
/ 09 марта 2017

нисходящий алфавит:

List<String> list;
...
Collections.sort(list);
Collections.reverse(list);
...