当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何按字母顺序对列表进行排序?》经验,为你挑选了8个好方法。

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



1> Thilo..:

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

 java.util.Collections.sort(listOfCountryNames)


实现Comparator = use java.text.Collat​​or.getInstance

2> Lena Schimme..:

使用Collections.sort解决方案

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

创建列表

添加一些国家名称

排序他们一次

永远不要再改变那个清单

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

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

使用TreeSet的解决方案

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

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

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

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

它只是更短.但是只有一条线更短.

永远不要担心这个列表现在真正排序,因为无论你做什么,TreeSet总是排序.

您不能有重复的条目.根据您的情况,这可能是专业人士或骗子.如果您需要重复,请坚持您的列表.

一位经验丰富的程序员看着TreeSet countyNames并立即知道:这是一个排序的字符串集合,没有重复,我可以肯定这在任何时候都是如此.简短声明中的大量信息.

在某些情况下真正的表现胜利.如果您使用List并经常插入值,并且可以在这些插入之间读取列表,则必须在每次插入后对列表进行排序.该集合也是如此,但速度要快得多.

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

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


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

3> Vitalii Fedo..:

您可以使用Java 8 Stream或Guava创建新的排序副本:

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

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

Collections.sort(names);



4> Tirath..:

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

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 softDrinkList = new ArrayList() ;
        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);
        }   
    }
}


同样,当一行代码时,所有这些代码都没有理由.看莉娜的回答.

5> Tom Hawtin -..:

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



6> Victor Petit..:

在一行中,使用Java 8:

list.sort(Comparator.naturalOrder());



7> Oliv..:

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

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

您可以设置collat​​or强度,请参阅javadoc.

以下是斯洛伐克的一个例子:

List 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]



8> prashant..:

这是你要找的

listOfCountryNames.sort(String::compareToIgnoreCase)

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有