如何按字母顺序排列列表?
我有一个包含国家名称的List<String>
对象。 我怎样才能按字母顺序排列这个列表?
假设这些是string,使用方便的静态方法sort
…
java.util.Collections.sort(listOfCountryNames)
解决scheme与Collections.sort
如果您被迫使用该列表,或者如果您的程序具有类似的结构
- 创build列表
- 添加一些国家名称
- 分类一次
- 永远不要再改变这个列表
那么Thilos的答案将是最好的办法。 如果你将它与Tom Hawtin的build议结合起来,你会得到:
java.util.Collections.sort(listOfCountryNames, Collator.getInstance());
带有TreeSet的解决scheme
如果您可以自由决定,并且您的应用程序可能变得更复杂,那么您可以改变您的代码来使用TreeSet。 这种集合只是在插入时对input进行sorting。 不需要调用sort()。
Collection<String> countryNames = new TreeSet<String>(Collator.getInstance()); countryNames.add("UK"); countryNames.add("Germany"); countryNames.add("Australia"); // Tada... sorted.
关于为什么我更喜欢TreeSet的附注
这有一些微妙但重要的优点:
- 它只是更短。 虽然只有一行较短。
- 不用担心这个列表是否真的被sorting,因为TreeSet总是被sorting,不pipe你做什么。
- 你不能有重复的条目。 根据你的情况,这可能是一个专业或一个骗局。 如果您需要重复,请坚持您的列表。
- 一位经验丰富的程序员看着
TreeSet<String> countyNames
并立即知道: 这是一个没有重复的string的sorting集合,我可以肯定这是真实的每一个时刻 。 如此多的信息在一个简短的声明。 - 在某些情况下真正的performance胜利。 如果您使用List,并且经常插入值,并且列表可能在这些插入之间被读取,那么您必须在每次插入之后对列表进行sorting。 该集合是一样的,但速度更快。
为正确的任务使用正确的集合是编写短而无缺陷的代码的关键。 这不是在这种情况下的示范,因为你只保存一行。 但是我已经停止计算,当他们想要确保没有重复的时候,看到有人使用列表的次数,然后自己构build这个function。 甚至更糟糕的是,当你真的需要一个地图时使用两个列表。
不要误解我的意思:使用Collections.sort不是错误或缺陷。 但是有很多情况下TreeSet更清洁。
您可以使用Java 8 Stream或Guava创build新的sorting副本:
// Java 8 version List<String> sortedNames = names.stream().sorted().collect(Collectors.toList()); // Guava version List<String> sortedNames = Ordering.natural().sortedCopy(names);
另一种select是通过Collections API进行就地sorting:
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) { 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); } } }
使用Collections.sort
的两个参数。 你将需要一个合适的Comparator
来处理合适的情况(即,做词法,而不是UTF16sorting),比如通过java.text.Collator.getInstance
获得的。
除非您只用无重音的英文排列string,否则可能需要使用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]
这是你在找什么
listOfCountryNames.sort(String::compareToIgnoreCase)
通过使用Collections.sort()
,我们可以对列表进行sorting。
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]
//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; } }
字母降序:
List<String> list; ... Collections.sort(list); Collections.reverse(list);
与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));
你可以尝试使用我制作的方法。
String key
– 将是你想要的顺序,在这种情况下按字母顺序。 只要把“abc …”。
String list[]
– 您要按顺序放置的列表。
int index
– 设置为0,将设置该键的偏移量。
public static String[] order(String key, String list[], int index) { ArrayList<String> order_List = new ArrayList<String>(); ArrayList<String> temp_Order_List = null; char[] key_char = key.toCharArray(); for (int offset = 0; offset < key_char.length; offset++) { if (key_char.length >= offset + index) { String str = (index > 1 ? list[0].substring(0, index - 1) : "") + new String(key_char, offset, 1); for (int i = 0; i < list.length; i++) { temp_Order_List = new ArrayList<String>(); for (int k = 0; k < list.length; k++) { if (!order_List.contains(list[k]) && !temp_Order_List.contains(list[k])) { if (list[k].equalsIgnoreCase(str)) order_List.add(list[k]); else if (list[k].toLowerCase().startsWith(str.toLowerCase())) { temp_Order_List.add(list[k]); } } } if (temp_Order_List.size() > 0) { if (temp_Order_List.size() > 1) { String[] add = order(key, temp_Order_List.toArray(new String[temp_Order_List .size()]), index + 1); for (String s : add) { order_List.add(s); } } else { order_List.add(temp_Order_List.get(0)); } } } } } return order_List.toArray(new String[order_List.size()]); }