Java技巧:列表排序

原创 2004年08月09日 00:00:00
在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)。这样,元素将总是排序形式的。

列表排序

在项目里碰到一个需求,关于列表排序的,刚开始思路一直在基础的列表排序算法上,想了半天也没想出来怎么处理这种情况,越想越复杂。在网上查询资料的时候,意识到可以利用数据库本身去做排序更新,感觉思路比较新颖...
  • hzygcs
  • hzygcs
  • 2017年12月20日 16:59
  • 29

JAVA 列表排序

在进行java开发时,经常需要对list进行排序,本文对此进行小结。总结了两种方法,第一种是通过原生支持的Comparator做排序,第二种是通过apache-common的工具包进行排序。相比而言,...
  • dangerous_fire
  • dangerous_fire
  • 2015年03月28日 09:37
  • 1072

Python小技巧 3:列表项的排序

典型代码1: data_list = [6, 9, 1, 3, 0, 10, 100, -100] data_list.sort() print(data_list) 输出1: [-100, 0, 1...
  • cnweike
  • cnweike
  • 2016年10月24日 13:53
  • 1103

dede生成多种不同排序列表页

本文需演示的最终效果就是修改dede默认只能一个列表页的功能,简单的说,就是有多个不同排序的列表页。最终效果图如下。 dede生成多种不同排序列表页修改方法第1步:找到并打开dede\inc\...
  • w617777
  • w617777
  • 2016年02月19日 12:32
  • 994

VC之列表控件排序

本文简单介绍下VC列表控件排序功能实现。 1.新建对话框应用程序 新建对话框应用程序,并且添加List列表控件。 2.添加相关变量和函数 class CListSortDl...
  • bingdianlanxin
  • bingdianlanxin
  • 2015年04月05日 20:06
  • 1048

省份、城市列表排序规则

/**      * 对省份按照拼音进行排序      * @author wxliyong      * @date 2015-5-11 下午6:11:50      */     priva...
  • jakeswang
  • jakeswang
  • 2016年03月17日 10:51
  • 2145

Matlab 文件按自然排序 转list文件名列表

s_SrcList_A = dirr( Src_A_Path ); c_List_A = struct2cell(s_SrcList_A); c_List_A = c_List_A(1,:); Src...
  • yangyangyang20092010
  • yangyangyang20092010
  • 2017年04月26日 21:12
  • 442

设计简单的后台管理的数据排序

场景:前端需要展示一个列表(如:首页的轮播图),后台需要能够控制列表数据的排序。需求:自动规则 + 运营干预,干预包括:降低排名,提升排名,设定位置和新增item实现:在Web后台管理系统中,列表形式...
  • gqkzwy
  • gqkzwy
  • 2017年01月06日 10:29
  • 890

联系人列表字母排序索引(一)

很久没有写博客了,对自己又放松了很多。这篇博客本来早就要写了,迟迟拖到现在。今天这里要说的是,联系人列表,分组带索引,即联系人按字母顺序排列并分组,右边还有索引条。先看下效果: 就是这么一个效...
  • meijian531161724
  • meijian531161724
  • 2016年05月31日 13:57
  • 1883

利用jQuery对无序列表排序

2015-07-16 11:53 409人阅读 评论(0) 收藏 举报  分类:   js(60)  jquery(12)  利用jQuery对无序列表排序 利用...
  • zhu82770802
  • zhu82770802
  • 2016年07月12日 16:11
  • 1313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java技巧:列表排序
举报原因:
原因补充:

(最多只允许输入30个字)