it-swarm.com.ru

Как я могу отсортировать список по алфавиту?

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

161
Lennie

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

 Java.util.Collections.sort(listOfCountryNames)
194
Thilo

Решение с Collections.sort

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

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

тогда ответ Тилоса будет лучшим способом сделать это. Если вы объедините это с советом от Tom Hawtin - 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 намного чище.

137
Lena Schimmel

Вы можете создать новую отсортированную копию, используя 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);
26
Vitalii Fedorenko

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

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);
        }   
    }
}
23
Tirath

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

9
Tom Hawtin - tackline

Если вы не сортируете строки только на английском языке без акцента, вы, вероятно, захотите использовать 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]
7
Oliv

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

listOfCountryNames.sort(String::compareToIgnoreCase)
5
prashant

В одной строке с помощью Java 8:

list.sort(Comparator.naturalOrder());
4
Victor Petit

Используя 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]
4
ASR

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

List<String> list;
...
Collections.sort(list);
Collections.reverse(list);
2
norbDEV
//Here is sorted List alphabetically with syncronized
package com.mnas.technology.automation.utility;
import Java.util.ArrayList;
import Java.util.Collections;
import Java.util.Comparator;
import Java.util.Iterator;
import Java.util.List;

import org.Apache.log4j.Logger;
/**
* 
* @author manoj.kumar
*/
public class SynchronizedArrayList {
static Logger log = Logger.getLogger(SynchronizedArrayList.class.getName());
@SuppressWarnings("unchecked")
public static void main(String[] args) {

List<Employee> synchronizedList = Collections.synchronizedList(new ArrayList<Employee>());
synchronizedList.add(new Employee("Aditya"));
synchronizedList.add(new Employee("Siddharth"));
synchronizedList.add(new Employee("Manoj"));
Collections.sort(synchronizedList, new Comparator() {
public int compare(Object synchronizedListOne, Object synchronizedListTwo) {
//use instanceof to verify the references are indeed of the type in question
return ((Employee)synchronizedListOne).name
.compareTo(((Employee)synchronizedListTwo).name);
}
}); 
/*for( Employee sd : synchronizedList) {
log.info("Sorted Synchronized Array List..."+sd.name);
}*/

// when iterating over a synchronized list, we need to synchronize access to the synchronized list
synchronized (synchronizedList) {
Iterator<Employee> iterator = synchronizedList.iterator();
while (iterator.hasNext()) {
log.info("Sorted Synchronized Array List Items: " + iterator.next().name);
}
}

}
}
class Employee {
String name;
Employee (String name) {
this.name = name;

}
}
0
user4423251

То же самое в Java 8: -

//Assecnding order
        listOfCountryNames.stream().sorted().forEach((x) -> System.out.println(x));

//Decending order
        listOfCountryNames.stream().sorted((o1, o2) -> o2.compareTo(o1)).forEach((x) -> System.out.println(x));
0
Vijay Gupta