22.7   线性表和集合的静态方法

可以用TreeSet在规则集中存储有序的元素。但是线性表不支持有序存储。然而,Java集合框架在Collections类中提供了用于对线性表进行排序的静态方法。Collections类还包含用于线性表的binarySearch、reverse、shuffle、copy和fill方法,以及用于集合的max、min、disjoint和frequency方法,如图22-8所示。

java指定长度_java指定长度

(点击查看大图)图22-8   Collections类包含操作线性表和集合的静态方法使用Comparable接口中的compareTo方法,可以对线性表中的可比较的元素以自然顺序排序。也可以指定比较器来对元素排序。例如,下面的代码就是对线性表中的字符串排序:

java指定长度_字符串_02

输出为[blue, green, red]。

上面的代码以升序对线性表排序。要以降序排列,可以简单地使用Collections.reverseOrder()方法返回一个Comparator对象,该方法以逆序排列元素。例如,下面的代码就是对字符串线性表以降序排列:

java指定长度_静态线性表求表长度java_03

输出为[yellow, red, green, blue]。

使用binarySearch方法可以在线性表中查找一个键值。这个线性表必须提前以升序排列好。如果这个键值没有在线性表中,那么这个方法就会返回-(插入点+1)(-(insertion point+1))。回忆一下,如果存在一个条目,插入点就是条目在线性表中的位置。例如,下面的代码在一个整数线性表和一个字符串线性表中查找键值:

java指定长度_静态方法_04

java指定长度_java指定长度_05

上面代码的输出为

java指定长度_静态线性表求表长度java_06

可以使用方法reverse将线性表中的元素以逆序排列。例如,下面的代码显示[blue, green, red, yellow]:

java指定长度_静态方法_07

可以使用方法shuffle(List)对线性表中的元素进行随机的重新排序。例如,下面的代码打乱list中的元素:

java指定长度_静态线性表求表长度java_08

也可以使用方法shuffle(List, Random)以一个指定的Random对象对线性表中的元素随机重新排序。要产生一个和原始线性表拥有相同元素序列的线性表,使用指定的Random对象是很有用的。例如,下面的代码打乱list中的元素:

java指定长度_静态方法_09

你将看到list1和list2在打乱之前和之后拥有相同的元素序列。

可以使用方法copy(det,src)将源线性表中的所有元素以同样的下标复制到目标线性表中。目标线性表必须和源线性表等长。如果源线性表的长度大于目标线性表,那么,源线性表中的剩余元素不会受到影响。例如,下面的代码将list2复制到list1中:

java指定长度_静态线性表求表长度java_10

list1的输出就是[white,black,green,blue]。copy方法执行的是浅复制。复制的只是线性表中元素的引用。

可以使用方法nCopies(int n,object o)创建一个包含指定对象的n个副本的不可变线性表。例如,下面的代码用5个Calender对象创建一个线性表:

java指定长度_线性表_11

用nCopies方法创建的线性表是不可变的,因此,不能在该线性表中添加、删除或更新元素。所有的元素都有相同的引用。

可以使用方法fill(List list,Object o)来用指定元素替换线性表中的所有元素。例如,下面的代码显示[black,black,black]:

java指定长度_java指定长度_12

可以使用max和min方法找出集合中的***元素和最小元素。集合中的元素必须是使用Comparable接口或Comparator接口可比较的。例如,下面的代码显示集合中***的字符串和最小的字符串:

java指定长度_字符串_13

如果两个集合没有相同的元素,那么方法disjoint(collection1,collection2)返回true。例如,在下面的代码中,disjoint(collection1,collection2)方法返回false,但是disjoint(collection1,collection3)方法返回true。

java指定长度_静态线性表求表长度java_14

使用方法frequency(collection,element)可以找出集合中某元素的出现次数。例如,在下面代码中frequency(collection,"red")返回2。

java指定长度_静态方法_15