我有一个List
包含国家/地区名称的对象.如何按字母顺序对此列表进行排序?
假设这些是字符串,使用方便的静态方法sort
...
java.util.Collections.sort(listOfCountryNames)
如果您被迫使用该List,或者您的程序具有类似的结构
创建列表
添加一些国家名称
排序他们一次
永远不要再改变那个清单
然后Thilos的回答将是最好的方式.如果你把它与Tom Hawtin的建议结合起来-你会得到:
java.util.Collections.sort(listOfCountryNames, Collator.getInstance());
如果您可以自由决定,并且您的应用程序可能会变得更复杂,那么您可能会更改代码以使用TreeSet.这种集合在插入时对您的条目进行排序.无需调用sort().
CollectioncountryNames = new TreeSet (Collator.getInstance()); countryNames.add("UK"); countryNames.add("Germany"); countryNames.add("Australia"); // Tada... sorted.
这有一些微妙但重要的优点:
它只是更短.但是只有一条线更短.
永远不要担心这个列表现在真正排序,因为无论你做什么,TreeSet总是排序.
您不能有重复的条目.根据您的情况,这可能是专业人士或骗子.如果您需要重复,请坚持您的列表.
一位经验丰富的程序员看着TreeSet
并立即知道:这是一个排序的字符串集合,没有重复,我可以肯定这在任何时候都是如此.简短声明中的大量信息.
在某些情况下真正的表现胜利.如果您使用List并经常插入值,并且可以在这些插入之间读取列表,则必须在每次插入后对列表进行排序.该集合也是如此,但速度要快得多.
使用正确的集合来完成正确的任务是编写简短和无错误代码的关键.在这种情况下,它不是示范性的,因为您只需保存一行.但我已经停止计算,当他们想要确保没有重复项时,我经常看到有人使用List,然后自己构建该功能.或者更糟糕的是,当你真正需要Map时使用两个列表.
不要误会我的意思:使用Collections.sort不是错误或缺陷.但是在很多情况下,TreeSet更清晰.
您可以使用Java 8 Stream或Guava创建新的排序副本:
// Java 8 version ListsortedNames = names.stream().sorted().collect(Collectors.toList()); // Guava version List sortedNames = Ordering.natural().sortedCopy(names);
另一种选择是通过Collections API进行就地排序:
Collections.sort(names);
迟到总比不到好!以下是我们如何做到这一点(仅限学习目的) -
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) { ListsoftDrinkList = 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); } } }
使用两个参数Collections.sort
.您将需要一个适当的Comparator
处理适当的案例(即词汇,而不是UTF16订购),例如通过可获得的案例java.text.Collator.getInstance
.
在一行中,使用Java 8:
list.sort(Comparator.naturalOrder());
除非你只用无重音的英语排序字符串,否则你可能想要使用Collator
.它会正确排序变音符号,可以忽略大小写和其他语言特定的东西:
Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));
您可以设置collator强度,请参阅javadoc.
以下是斯洛伐克的一个例子:
Listcountries = 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]
这是你要找的
listOfCountryNames.sort(String::compareToIgnoreCase)