java

位置:IT落伍者 >> java >> 浏览文章

Java编程技巧:列表排序代码分析


发布日期:2021年01月16日
 
Java编程技巧:列表排序代码分析

在Java Collection Framework中定义的List实现有VectorArrayList和LinkedList这些集合提供了对对象组的索引访问他们提供了元素的添加与删除支持然而它们并没有内置的元素排序支持

你能够使用javautilCollections类中的sort()方法对List元素进行排序你既可以给方法传递一个List对象也可以传递一个List和一个Comparator如果列表中的元素全都是相同类型的类并且这个类实现了Comparable接口你可以简单的调用Collectionssort()如果这个类没有实现Comparator你也可以传递一个Comparator到方法sort()中进行排序如果你不想使用缺省的分类顺序进行排序你同样可以传递一个Comparator到方法sort()中来进行排序如果列表中的元素并不都是相同类型的类你在进行排序的时候就不是这样幸运了除非你编写一个专用的跨类的Comparator

排序的顺序怎么样呢?如果元素是String对象却省的排序顺序是按照字符编码进行的基本上是每个字符的ASCII/Unicode值如果严格的限制在处理英文却省的排序顺序通常是足够的因为它首先排AZ然后是小写字母az然而如果你处理非英文字或者你只是想使用不同的排序顺序这样Collectionssort()就出现了第二种变化例如你想使用字符串的反序进行排序为了实现这个功能你可以在Collections类中通过reverseOrder()来获取一个反序Comparator然后你将反序Comparator传递给sort()方法换句话说你作如下工作

List list = ;

Comparator comp = CollectionsreverseOrder();

Collectionssort(list comp);

如果列表包含项目Man man Woman 和woman排序好的列表将是Man Woman man woman这里没有什么复杂的需要注意的非常重要的一点是Collectionssort()是进行原位排序如果你需要保留原序需要先对原集合进行复制在排序就像这样

List list = ;

List copyOfList = new ArrayList(list);

Collectionssort(copyOfList);

这里排好序的列表是Man Woman man woman但是原始列表(Man man Woman woman)被保留了

到目前为止排序是区分大小写的你如何进行不去分大小写的排序呢?一种实现方式是象这样实现Comparator:

public static class CaseInsensitiveComparator

implements Comparator {

public int compare(Object element

Object element) {

String lower =

elementtoString()toLowerCase();

String lower =

elementtoString()toLowerCase();

return pareTo(lower);

}

}

你确实不需要手工的创建这个类而是你可以是用以存在的ComparatorCASE_INSENSIVTIVE_ORDER它是在String类中定义的

这种实现方式有一点小小的问题Sort()算法提供稳定的排序并保持与原有序列相同的元素这意味着一个包含两个元素womanWoman的列表将有不同的排序而这种不同是根据两个元素在列表中出现的先后次序决定的

语言的不同又会怎么样呢?javatext包提供了Collector和CollectionKey类来进行区分语言的排序这里是例子:

注意如果你的文本是本地语言而不是缺省语言你需要传递一个本地语种给getInstance()方法就象:

public static class CollatorComparator

implements Comparator {

Collator collator = CollatorgetInstance();

public int compare(Object element

Object element) {

CollationKey key = collatorgetCollationKey(

elementtoString());

CollationKey key = collatorgetCollationKey(

elementtoString());

return pareTo(key);

}

}

你是在对集合关键字进行排序而不是实际的字符串这不仅提供固定的不区分大小写的排序而且它是跨语种的排序换句话说如果你对西班牙文和非西班牙文的混合词进行排序词ma?ana (tomorrow)将排在mantra的前面如果你不使用Collectorma?ana将排在mantra的后面

下面这个程序对一个列表进行不同类型的排序(缺省的区分大小写的区分语种的)

import javaawtBorderLayout;

import javaawtContainer;

import javaio*;

import javatext*;

import javautil*;

import javaxswing*;

public class SortIt {

public static class CollatorComparator

implements Comparator {

Collator collator = CollatorgetInstance();

public int compare(Object element

Object element) {

CollationKey key = collatorgetCollationKey(

elementtoString());

CollationKey key = collatorgetCollationKey(

elementtoString());

return pareTo(key);

}

}

public static class CaseInsensitiveComparator

implements Comparator {

public int compare(Object element

Object element) {

String lower = elementtoString()

toLowerCase();

String lower = elementtoString()

toLowerCase();

return pareTo(lower);

}

}

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);

framesetDefaultCloseOperation(

JFrameEXIT_ON_CLOSE);

Container contentPane = framegetContentPane();

JTextArea textArea = new JTextArea();

JScrollPane pane = new JScrollPane(textArea);

contentPaneadd(pane BorderLayoutCENTER);

// Create buffer for output

StringWriter buffer = new StringWriter();

PrintWriter out = new PrintWriter(buffer);

// Create initial list to sort

List list = new ArrayList(ArraysasList(words));

outprintln(Original list:);

outprintln(list);

outprintln();

// Perform default sort

Collectionssort(list);

outprintln(Default sorting:);

outprintln(list);

outprintln();

// Reset list

list = new ArrayList(ArraysasList(words));

// Perform case insensitive sort

Comparator comp = new CaseInsensitiveComparator();

Collectionssort(list comp);

outprintln(Case insensitive sorting:);

outprintln(list);

outprintln();

// Reset list

list = new ArrayList(ArraysasList(words));

// Perform collation sort

comp = new CollatorComparator();

Collectionssort(list comp);

outprintln(Collator sorting:);

outprintln(list);

outprintln();

// Fill text area and display

textAreasetText(buffertoString());

framepack();

frameshow();

}

}

如果你的主要问题是顺序访问可能列表不是你的好的数据结构选择只要你的集合没有重复你可以在树(TreeSet)中保存你的元素(提供或不提供Comparator)这样元素将总是排序形式的               

上一篇:时尚:用Java 编写手机应用程序

下一篇:一个用java演示的产生图像烟花的算法