如何按字母顺序对列表进行排序?

Len*_*nie 167 java sorting collections list alphabetical

我有一个List<String>包含国家/地区名称的对象.如何按字母顺序对此列表进行排序?

Thi*_*ilo 201

假设这些是字符串,使用方便的静态方法sort...

 java.util.Collections.sort(listOfCountryNames)
Run Code Online (Sandbox Code Playgroud)

  • 实现Comparator = use java.text.Collat​​or.getInstance (7认同)
  • 这并不能回答问题,因为与按字母顺序排序不同,“Z”位于“a”之前。问题是关于字母排序的。 (4认同)

Len*_*mel 139

使用Collections.sort解决方案

如果您被迫使用该List,或者您的程序具有类似的结构

  • 创建列表
  • 添加一些国家名称
  • 排序他们一次
  • 永远不要再改变那个清单

然后Thilos的回答将是最好的方式.如果你把它与Tom Hawtin的建议结合起来-你会得到:

java.util.Collections.sort(listOfCountryNames, Collator.getInstance());
Run Code Online (Sandbox Code Playgroud)

使用TreeSet的解决方案

如果您可以自由决定,并且您的应用程序可能会变得更复杂,那么您可能会更改代码以使用TreeSet.这种集合在插入时对您的条目进行排序.无需调用sort().

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

关于为什么我更喜欢TreeSet的旁注

这有一些微妙但重要的优点:

  • 它只是更短.但是只有一条线更短.
  • 永远不要担心这个列表现在真正排序,因为无论你做什么,TreeSet总是排序.
  • 您不能有重复的条目.根据您的情况,这可能是专业人士或骗子.如果您需要重复,请坚持您的列表.
  • 一位经验丰富的程序员看着TreeSet<String> countyNames并立即知道:这是一个排序的字符串集合,没有重复,我可以肯定这在任何时候都是如此.简短声明中的大量信息.
  • 在某些情况下真正的表现胜利.如果您使用List并经常插入值,并且可以在这些插入之间读取列表,则必须在每次插入后对列表进行排序.该集合也是如此,但速度要快得多.

使用正确的集合来完成正确的任务是编写简短和无错误代码的关键.在这种情况下,它不是示范性的,因为您只需保存一行.但我已经停止计算,当他们想要确保没有重复项时,我经常看到有人使用List,然后自己构建该功能.或者更糟糕的是,当你真正需要Map时使用两个列表.

不要误会我的意思:使用Collections.sort不是错误或缺陷.但是在很多情况下,TreeSet更清晰.

  • 如果项目是可变的,TreeSet将不会保持排序. (7认同)
  • @JoshuaGoldberg我认为它不仅会被排序,它也会停止正常工作.至少如果对象的变异影响其排序顺序.树集依赖于正在排序的项目来执行其任务(如搜索,删除,插入......). (3认同)

Vit*_*nko 27

您可以使用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); 
Run Code Online (Sandbox Code Playgroud)

另一种选择是通过Collections API进行就地排序:

Collections.sort(names);
Run Code Online (Sandbox Code Playgroud)


Tir*_*ath 25

迟到总比不到好!以下是我们如何做到这一点(仅限学习目的) -

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);
        }   
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 同样,当一行代码时,所有这些代码都没有理由.看莉娜的回答. (4认同)
  • @james.garriss,Lena 的答案是简单的字符串列表,这是包含要排序的字符串属性的对象列表。 (2认同)

Tom*_*ine 9

使用两个参数Collections.sort.您将需要一个适当的Comparator处理适当的案例(即词汇,而不是UTF16订购),例如通过可获得的案例java.text.Collator.getInstance.


Vic*_*tit 9

在一行中,使用Java 8:

list.sort(Comparator.naturalOrder());
Run Code Online (Sandbox Code Playgroud)


Oli*_*liv 7

除非你只用无重音的英语排序字符串,否则你可能想要使用Collator.它会正确排序变音符号,可以忽略大小写和其他语言特定的东西:

Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));
Run Code Online (Sandbox Code Playgroud)

您可以设置collat​​or强度,请参阅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]
Run Code Online (Sandbox Code Playgroud)


小智 7

更简单的是,您可以使用方法参考。

 list.sort(String::compareTo);
Run Code Online (Sandbox Code Playgroud)


ASR*_*ASR 5

通过使用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

sudheer
kumar
surendra
kb
[kb, kumar, sudheer, surendra]
Run Code Online (Sandbox Code Playgroud)


pra*_*ant 5

这是你要找的

listOfCountryNames.sort(String::compareToIgnoreCase)
Run Code Online (Sandbox Code Playgroud)

  • 不适用于带有 É è 等的语言...您需要先去掉重音符号 (2认同)

小智 5

您可以使用以下行

Collections.sort(listOfCountryNames, String.CASE_INSENSITIVE_ORDER)
Run Code Online (Sandbox Code Playgroud)

它与Thilo的建议类似,但不会区分大小写字符。