


| List list = ...;Comparator comp = Collections.reverseOrder();Collections.sort(list, comp); |
如果列表包含项目:Man, man, Woman, 和woman,排序好的列表将是Man, Woman, man, woman。这里没有什么复杂的。需要注意的非常重要的一点是Collections.sort()是进行原位排序。如果你需要保留原序,需要先对原集合进行复制,在排序,就像这样:
| List list = ...;List copyOfList = new ArrayList(list);Collections.sort(copyOfList); |
这里,排好序的列表是:Man, Woman, man, woman,但是原始列表(Man, man, Woman, woman)被保留了。
到目前为止,排序是区分大小写的。你如何进行不去分大小写的排序呢?一种实现方式是象这样实现Comparator:
| public static class CaseInsensitiveComparator implements Comparator {public int compare(Object element1, Object element2) {String lower1 = element1.toString().toLowerCase();String lower2 = element2.toString().toLowerCase();return lower1.compareTo(lower2);} |
你确实不需要手工的创建这个类。而是,你可以是用以存在的Comparator,CASE_INSENSIVTIVE_ORDER,它是在String类中定义的。
这种实现方式有一点小小的问题。Sort()算法提供稳定的排序,并保持与原有序列相同的元素。这意味着一个包含两个元素”woman”和”Woman”的列表将有不同的排序,而这种不同是根据两个元素在列表中出现的先后次序决定的。
语言的不同又会怎么样呢?java.text包提供了Collector和CollectionKey类来进行区分语言的排序。这里是例子:
注意,如果你的文本是本地语言,而不是缺省语言,你需要传递一个本地语种给getInstance()方法,就象:
| public static class CollatorComparator implements Comparator {Collator collator = Collator.getInstance();public int compare(Object element1, Object element2) {CollationKey key1 = collator.getCollationKey(element1.toString());CollationKey key2 = collator.getCollationKey(element2.toString());return key1.compareTo(key2);}} |
你是在对集合关键字进行排序,而不是实际的字符串。这不仅提供固定的不区分大小写的排序,而且它是跨语种的排序。换句话说,如果你对西班牙文和非西班牙文的混合词进行排序,词ma?ana (tomorrow)将排在mantra的前面。如果你不使用Collector,ma?ana将排在mantra的后面。
下面这个程序对一个列表进行不同类型的排序(缺省的、区分大小写的、区分语种的):
| import java.awt.BorderLayout;import java.awt.Container;import java.io.*;import java.text.*;import java.util.*;import javax.swing.*;public class SortIt {public static class CollatorComparator implements Comparator {Collator collator = Collator.getInstance();public int compare(Object element1, Object element2) {CollationKey key1 = collator.getCollationKey(element1.toString());CollationKey key2 = collator.getCollationKey(element2.toString());return key1.compareTo(key2);}}public static class CaseInsensitiveComparator implements Comparator {public int compare(Object element1, Object element2) {String lower1 = element1.toString().toLowerCase();String lower2 = element2.toString().toLowerCase();return lower1.compareTo(lower2);}}public static void main(String args[]) {String words[] = {man, Man, Woman, woman, Manana, manana, ma?ana, Ma?ana,Mantra, mantra, mantel, Mantel};// Create frame to display sortingsJFrame frame = new JFrame(Sorting);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);Container contentPane = frame.getContentPane();JTextArea textArea = new JTextArea();JScrollPane pane = new JScrollPane(textArea);contentPane.add(pane, BorderLayout.CENTER);// Create buffer for outputStringWriter buffer = new StringWriter();PrintWriter out = new PrintWriter(buffer);// Create initial list to sortList list = new ArrayList(Arrays.asList(words));out.println(Original list:);out.println(list);out.println();// Perform default sortCollections.sort(list);out.println(Default sorting:);out.println(list);out.println();// Reset list list = new ArrayList(Arrays.asList(words));// Perform case insensitive sortComparator comp = new CaseInsensitiveComparator();Collections.sort(list, comp);out.println(Case insensitive sorting:);out.println(list);out.println();// Reset listlist = new ArrayList(Arrays.asList(words));// Perform collation sortcomp = new CollatorComparator();Collections.sort(list, comp);out.println(Collator sorting:);out.println(list);out.println();// Fill text area and displaytextArea.setText(buffer.toString());frame.pack();frame.show();} |
如果你的主要问题是顺序访问,可能列表不是你的好的数据结构选择。只要你的集合没有重复,你可以在树(TreeSet)中保存你的元素(提供或不提供Comparator)。这样,元素将总是排序形式的。