在Java Collection Framework中定义的List实现有Vector,ArrayList和LinkedList。这些集合提供了对对象组的索引访问。他们提供了元素的添加与删除支持。然而,它们并没有内置的元素排序支持。
你能够使用java.util.Collections类中的sort()方法对List元素进行排序。你既可以给方法传递一个List对象,也可以传递一个List和一个Comparator。如果列表中的元素全都是相同类型的类,并且这个类实现了Comparable接口,你可以简单的调用Collections.sort()。如果这个类没有实现Comparator,你也可以传递一个Comparator到方法sort()中,进行排序。如果你不想使用缺省的分类顺序进行排序,你同样可以传递一个Comparator到方法sort()中来进行排序。如果列表中的元素并不都是相同类型的类,你在进行排序的时候就不是这样幸运了。除非你编写一个专用的跨类的Comparator。
排序的顺序怎么样呢?如果元素是String对象,却省的排序顺序是按照字符编码进行的,基本上是每个字符的ASCII/Unicode值。如果严格的限制在处理英文,却省的排序顺序通常是足够的,因为它首先排A-Z,然后是小写字母a-z。然而如果你处理非英文字,或者你只是想使用不同的排序顺序,这样Collections.sort()就出现了第二种变化。例如,你想使用字符串的反序进行排序。为了实现这个功能,你可以在Collections类中通过reverseOrder()来获取一个反序Comparator。然后,你将反序Comparator传递给sort()方法。换句话说,你作如下工作:
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 sortings
JFrame 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 output
StringWriter buffer = new StringWriter();
PrintWriter out = new PrintWriter(buffer);
// Create initial list to sort
List list = new ArrayList(Arrays.asList(words));
out.println("Original list:");
out.println(list);
out.println();
// Perform default sort
Collections.sort(list);
out.println("Default sorting:");
out.println(list);
out.println();
// Reset list
list = new ArrayList(Arrays.asList(words));
// Perform case insensitive sort
Comparator comp = new CaseInsensitiveComparator();
Collections.sort(list, comp);
out.println("Case insensitive sorting:");
out.println(list);
out.println();
// Reset list
list = new ArrayList(Arrays.asList(words));
// Perform collation sort
comp = new CollatorComparator();
Collections.sort(list, comp);
out.println("Collator sorting:");
out.println(list);
out.println();
// Fill text area and display
textArea.setText(buffer.toString());
frame.pack();
frame.show();
}
}
如果你的主要问题是顺序访问,可能列表不是你的好的数据结构选择。只要你的集合没有重复,你可以在树(TreeSet)中保存你的元素(提供或不提供Comparator)。这样,元素将总是排序形式的。
分享到:
相关推荐
冒泡排序是最简单的排序算法之一,通过重复遍历待排序的元素列表,比较相邻元素并交换位置,直至列表排序完成。在Java中,冒泡排序通常使用两层循环实现。 2. 插入排序(Insertion Sort): 插入排序通过创建一个...
9. **错误处理与调试**:通过源码学习如何在Java中进行异常处理和调试技巧。 10. **开源社区**:了解如何从开源平台获取和贡献代码,以及遵循开源许可协议。 这个源码对于Java初学者或有经验的开发者都是宝贵的...
### 张孝祥Java面试技巧:深入理解Java集合框架 在Java编程中,掌握集合框架是面试中的关键技能之一。本文将围绕“张孝祥Java面试技巧”这一主题,深入探讨Java集合框架的重要组成部分——`map`、`set`、`list`,...
6. **数据结构与算法**:为了高效地管理和显示消息历史,源码可能使用了链表、队列、栈等数据结构,以及排序、查找等算法。理解这些数据结构和算法对于优化性能至关重要。 7. **异常处理**:良好的异常处理机制能...
这份"Java常见错误列表Java开发Java经验技巧共20页"的资料旨在帮助初学者和有经验的开发者更好地理解和解决这些问题,提高编程效率。以下是对这份资源中可能包含的关键知识点的详细阐述: 1. **错误类型与分类**: ...
例如,我们有一个`Person`类,它包含了姓名和年龄属性,我们可以让它实现`Comparable`接口,比较规则为按照年龄从小到大排序: ```java public class Person implements Comparable<Person> { private String name...
以下是一个简单的示例,展示如何使用Java对字符串列表进行排序: ```java import java.util.*; public class AlphabeticalSort { public static void main(String[] args) { List<String> stringList = Arrays....
可以通过分析代码了解冒泡排序的实现细节和优化技巧。 2. jdbc.txt:这个文件可能包含了一个或多个使用JDBC连接数据库并执行SQL的Java程序示例。从这个文件中,你可以学习如何配置数据库连接参数,编写SQL语句,...
以下是一个自定义比较器Comparator的例子,用于根据员工的身高排序: ```java Collections.sort(employees, new Comparator() { @Override public int compare(Employee e1, Employee e2) { return Double....
本教程将深入讲解如何实现RecyclerView的列表排序、悬停效果以及添加侧边索引。 ### 1. RecyclerView列表排序 在Android应用中,我们通常会从服务器或本地数据库获取数据,这些数据通常是未排序的。为了提供更好的...
- 使用`Collections.sort()`方法对扑克牌列表进行排序,传入自定义的`PokerComparator`实例。 5. **测试和优化** - 编写单元测试用例,覆盖各种可能的排序情况,确保排序逻辑的正确性。 - 如果性能是关注点,...
例如,我们可以用lambda来实现Comparator接口,进行列表排序: ```java List<String> list = Arrays.asList("a", "c", "b"); list.sort((s1, s2) -> s1.compareTo(s2)); ``` 第二个问题是Stream API。Stream API...
标题中的“浅谈Java字符串Java开发Java经验技巧共11页”表明这是一份关于Java编程,特别是关于Java字符串处理的深度技术文档。在Java中,字符串是编程中经常遇到的基本数据类型,对于任何Java开发者来说,理解和掌握...
冒泡排序通过重复遍历列表,每次比较相邻两个元素并将较大的元素向后移动,直至整个列表有序。 ```java public static void bubbleSort(int[] array) { boolean swapped; do { swapped = false; for (int i = 0...
Java字符界面的小程序是Java编程领域的一个基础应用实例,它主要使用Java的标准库(J2SE)来构建非...每个文件都可以作为一个独立的知识点,通过阅读和理解这些源代码,学习者可以深入掌握Java编程的基本原理和技巧。
- HashMap 不保证元素顺序,允许 null 键和值,而某些 Map 实现(如 TreeMap)会根据键排序,或者可以自定义比较器。 - HashMap 是非线程安全的,多线程环境下需要使用 Collections.synchronizedMap() 或 ...
3. **Java实现**:如何用Java编写这些排序算法的代码,可能包括使用数组、列表(ArrayList或LinkedList)等数据结构。 4. **效率分析**:讨论各种排序算法的时间复杂度和空间复杂度,以及在不同数据情况下(如已...
在“JavaAlgorithm-master”这个压缩包中,可能包含有上述各类算法的Java实现源码,通过阅读和实践这些代码,可以加深对算法原理的理解,并提升编程技巧。此外,还可能包括测试用例、注释以及可能的讲解文档,帮助...
卷 data 的文件夹 PATH 列表 卷序列号为 64ED-8C1D D:\我的酷盘\FTP\学员面试资料 │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐)....
卷 data 的文件夹 PATH 列表 卷序列号为 64ED-8C1D D:\我的酷盘\FTP\学员面试资料 │ 164个完整Java代码.zip │ J2EE综合--Struts常见错误的全面汇总.txt │ java程序员面试资料.zip │ JAVA笔试题(上海释锐)....