我有一个包含国家名称的 List<String>
对象,如何按字母顺序对此列表进行排序?
我有一个包含国家名称的 List<String>
对象,如何按字母顺序对此列表进行排序?
如果你被迫使用了那个List,或者你的程序结构如下:
那么Thilo的答案将是最好的方法。如果你结合Tom Hawtin-tackline的建议,你会得到:
java.util.Collections.sort(listOfCountryNames, Collator.getInstance());
如果你可以自由决定,并且你的应用程序可能会变得更加复杂,那么你可以改变你的代码,使用TreeSet代替。这种类型的集合在插入条目时会自动排序,无需调用sort()方法。
Collection<String> countryNames =
new TreeSet<String>(Collator.getInstance());
countryNames.add("UK");
countryNames.add("Germany");
countryNames.add("Australia");
// Tada... sorted.
这有一些微妙但重要的优点:
TreeSet<String> countyNames
时立即知道:这是一个没有重复项的排序字符串集合,并且我可以确信它在每一刻都是正确的。这么短的声明中包含了如此多的信息。为正确的任务选择正确的集合是编写简短且无漏洞代码的关键。在这种情况下,它可能不太明显,因为您只能节省一行。但我已经停止了统计有多少次看到某人想确保没有重复项时使用List,然后自己构建该功能。或者更糟糕的是,当您真正需要Map时却使用两个List。
不要误解:使用Collections.sort并没有错误或缺陷。但在许多情况下,TreeSet更加简洁。
String
默认使用的排序方式是字典排序,而不是按字母顺序排序。 'Z'
在字典排序中排在'a'
之前,与按字母顺序排序不同。 - Chai T. Rex你可以使用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);
另一个选项是通过Collections API原地进行排序:
Collections.sort(names);
String
的默认排序是词典排序,而不是字母表顺序。 'Z'
在字母表排序中排在'a'
之前。 - Chai T. Rex迟做总比不做好!以下是我们可以这样做的方式(仅供学习目的)-
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);
}
}
}
String
的默认排序是字典排序,而不是按字母顺序排序。 'Z'
在字典排序中位于 'a'
之前,与按字母顺序排序不同。 - Chai T. Rex使用 Java 8,一行代码实现:
list.sort(Comparator.naturalOrder());
String
的自然顺序Comparator
并非按字母顺序排序。 'Z'
排在'a'
之前,而不是按字母顺序排序。 - Chai T. Rex除非你只排序没有口音的英文字符串,否则你可能想使用Collator
。它可以正确地排序带有变音符号的字符,可以忽略大小写和其他语言特定的东西:
Collections.sort(countries, Collator.getInstance(new Locale(languageCode)));
你可以设置Collator的强度,请参见javadoc。Š
应该放在S
之后,但在UTF中Š
在Z
之后: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]
Collections.sort
方法。您将需要一个适当的Comparator
,该比较器会适当地处理大小写(即进行词法排序,而不是基于UTF16的排序),例如通过java.text.Collator.getInstance
获取的比较器。这就是您要找的内容。
listOfCountryNames.sort(String::compareToIgnoreCase)
list.sort(String::compareTo);
Collections.sort(listOfCountryNames, String.CASE_INSENSITIVE_ORDER)
这类似于Thilo的建议,但不会区分大小写字符。
'Z'
在'a'
之前。这个问题是关于字母顺序排序的。 - Chai T. Rex