Java Collections类操作集合详解
Collections类是Java提供的一个操作Set、List和Map等集合的工具类。Collections类提供了许多操作集合的静态方法,借助这些静态方法可以实现集合元素的排序、查找替换和复制等操作。下面介绍Collections类中操作集合的常用方法。
1)排序(Sort)
使用sort方法可以根据元素的自然顺序,对指定列表进行排序。列表中的所有元素都必须实现Comparable接口。或此列表内的所有元素都必须是使用指定比较器可相互比较的 Collections.sort(list,newComparator(){});
2)混排(Shuffling)
混排算法所做的正好与sort相反:它打乱在一个List中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排该List,这样的排列具有相同的可能性(假设随机源是公正的)。这个算法在实现一个碰运气的游戏中是非常有用的。例如,它可被用来混排代表一副牌的Card对象的一个List。另外,在生成测试案例时,它也是十分有用的。Collections.Shuffling(list)
3)反转(Reverse)
使用Reverse方法可以将元素进行反转。Collections.reverse(list)
4)替换所有的元素(Fill)
使用指定元素替换指定列表中的所有元素。Collections.fill(li,"aaa");
5)拷贝(Copy)
用两个参数,一个目标List和一个源List,将源的元素拷贝到目标,并覆盖它的内容。目标List至少与源一样长。如果它更长,则在目标List中的剩余元素不受影响。Collections.copy(list,li):后面一个参数是目标列表,前一个是源列表
6)返回Collections中最小元素(min)
根据指定比较器产生的顺序,返回给定collection的最小元素。collection中的所有元素都必须是通过指定比较器可相互比较的Collections.min(list)
7)返回Collections中最大元素(max)
根据指定比较器产生的顺序,返回给定collection的最大元素。collection中的所有元素都必须是通过指定比较器可相互比较的Collections.max(list)
8)lastIndexOfSubList
返回指定源列表中最后一次出现指定目标列表的起始位置,intcount=Collections.lastIndexOfSubList(list,li);
9)IndexOfSubList
返回指定源列表中第一次出现指定目标列表的起始位置,intcount=Collections.indexOfSubList(list,li);
10)Rotate
根据指定的距离循环移动指定列表中的元素,Collections.rotate(list,-1);如果是负数,则正向移动,正数则方向移动
排序(正向和逆向)
Collections提供了如下方法用于对List集合元素进行排序。
- voidreverse(Listlist):对指定List集合元素进行逆向排序。
- voidshuffle(Listlist):对List集合元素进行随机排序(shuffle方法模拟了“洗牌”动作)。
- voidsort(Listlist):根据元素的自然顺序对指定List集合的元素按升序进行排序。
- voidsort(Listlist,Comparatorc):根据指定Comparator产生的顺序对List集合元素进行排序。
- voidswap(Listlist,inti,intj):将指定List集合中的i处元素和j处元素进行交换。
- voidrotate(Listlist,intdistance):当distance为正数时,将list集合的后distance个元素“整体”移到前面;当distance为负数时,将list集合的前distance个元素“整体”移到后面。该方法不会改变集合的长度。
下面程序简单示范了利用Collections工具类来操作List集合。
例1
编写一个程序,对用户输入的5个商品价格进行排序后输出。这里要求使用Collections类中sort()方法按从低到高的顺序对其进行排序,最后将排序后的成绩输出。
具体实现代码如下:
publicclassTest1{ publicstaticvoidmain(String[]args){ Scannerinput=newScanner(System.in); Listprices=newArrayList(); for(inti=0;i<5;i++){ System.out.println("请输入第"+(i+1)+"个商品的价格:"); intp=input.nextInt(); prices.add(Integer.valueOf(p));//将录入的价格保存到List集合中 } Collections.sort(prices);//调用sort()方法对集合进行排序 System.out.println("价格从低到高的排列为:"); for(inti=0;i如上述代码,循环录入5个价格,并将每个价格都存储到已定义好的List集合prices中,然后使用Collections类的sort()方法对该集合元素进行升序排序。最后使用for循环遍历users集合,输出该集合中的元素。
该程序的执行结果如下所示。
请输入第1个商品的价格:
85
请输入第2个商品的价格:
48
请输入第3个商品的价格:
66
请输入第4个商品的价格:
80
请输入第5个商品的价格:
18
价格从低到高的排列为:
18 48 66 80 85
例2
循环录入5个商品的名称,并按录入时间的先后顺序进行降序排序,即后录入的先输出。
下面编写程序,使用Collections类的reverse()方法对保存到List集合中的5个商品名称进行反转排序,并输出排序后的商品信息。具体的实现代码如下:
publicclassTest2{ publicstaticvoidmain(String[]args){ Scannerinput=newScanner(System.in); Liststudents=newArrayList(); System.out.println("********商品信息********"); for(inti=0;i<5;i++){ System.out.println("请输入第"+(i+1)+"个商品的名称:"); Stringname=input.next(); students.add(name);//将录入的商品名称存到List集合中 } Collections.reverse(students);//调用reverse()方法对集合元素进行反转排序 System.out.println("按录入时间的先后顺序进行降序排列为:"); for(inti=0;i<5;i++){ System.out.print(students.get(i)+"\t"); } } }如上述代码,首先循环录入5个商品的名称,并将这些名称保存到List集合中,然后调用Collections类中的reverse()方法对该集合元素进行反转排序。最后使用for循环将排序后的集合元素输出。
执行该程序,输出结果如下所示。
********商品信息********
请输入第1个商品的名称:
果粒橙
请输入第2个商品的名称:
冰红茶
请输入第3个商品的名称:
矿泉水
请输入第4个商品的名称:
软面包
请输入第5个商品的名称:
巧克力
按录入时间的先后顺序进行降序排列为:
巧克力 软面包 矿泉水 冰红茶 果粒橙
查找、替换操作
Collections还提供了如下常用的用于查找、替换集合元素的方法。
- intbinarySearch(Listlist,Objectkey):使用二分搜索法搜索指定的List集合,以获得指定对象在List集合中的索引。如果要使该方法可以正常工作,则必须保证List中的元素已经处于有序状态。
- Objectmax(Collectioncoll):根据元素的自然顺序,返回给定集合中的最大元素。
- Objectmax(Collectioncoll,Comparatorcomp):根据Comparator指定的顺序,返回给定集合中的最大元素。
- Objectmin(Collectioncoll):根据元素的自然顺序,返回给定集合中的最小元素。
- Objectmin(Collectioncoll,Comparatorcomp):根据Comparator指定的顺序,返回给定集合中的最小元素。
- voidfill(Listlist,Objectobj):使用指定元素obj替换指定List集合中的所有元素。
- intfrequency(Collectionc,Objecto):返回指定集合中指定元素的出现次数。
- intindexOfSubList(Listsource,Listtarget):返回子List对象在父List对象中第一次出现的位置索引;如果父List中没有出现这样的子List,则返回-1。
- intlastIndexOfSubList(Listsource,Listtarget):返回子List对象在父List对象中最后一次出现的位置索引;如果父List中没有岀现这样的子List,则返回-1。
- booleanreplaceAll(Listlist,ObjectoldVal,ObjectnewVal):使用一个新值newVal替换List对象的所有旧值oldVal。
下面程序简单示范了Collections工具类的用法。
例3
编写一个程序,要求用户输入3个商品名称,然后使用Collections类中的fill()方法对商品信息进行重置操作,即将所有名称都更改为“未填写”。具体的实现代码如下:
publicclassTest3{ publicstaticvoidmain(String[]args){ Scannerinput=newScanner(System.in); Listproducts=newArrayList(); System.out.println("********商品信息********"); for(inti=0;i<3;i++){ System.out.println("请输入第"+(i+1)+"个商品的名称:"); Stringname=input.next(); products.add(name);//将用户录入的商品名称保存到List集合中 } System.out.println("重置商品信息,将所有名称都更改为'未填写'"); Collections.fill(products,"未填写"); System.out.println("重置后的商品信息为:"); for(inti=0;i如上述代码,首先循环录入3个商品名称,并将这些商品信息存储到List集合中,然后调用Collections类中的fill()方法将该集合中的所有元素值替换为“未填写”。最后使用for循环将替换后的集合元素输出。
运行该程序,执行结果如下所示。
********商品信息********
请输入第1个商品的名称:
苏打水
请输入第2个商品的名称:
矿泉水
请输入第3个商品的名称:
冰红茶
重置商品信息,将所有名称都更改为'未填写'
重置后的商品信息为:
未填写 未填写 未填写
例4
在一个集合中保存4个数据,分别输出最大最小元素和指定数据在集合中出现的次数。
publicclassTest4{ publicstaticvoidmain(String[]args){ ArrayListnums=newArrayList(); nums.add(2); nums.add(-5); nums.add(3); nums.add(0); System.out.println(nums);//输出:[2,-5,3,0] System.out.println(Collections.max(nums));//输出最大元素,将输出3 System.out.println(Collections.min(nums));//输出最小元素,将输出-5 Collections.replaceAll(nums,0,1);//将nums中的0使用1来代替 System.out.println(nums);//输出:[2,-5,3,1] //判断-5在List集合中出现的次数,返回1 System.out.println(Collections.frequency(nums,-5)); Collections.sort(nums);//对nums集合排序 System.out.println(nums);//输出:[-5,1,2,3] //只有排序后的List集合才可用二分法查询,输出3 System.out.println(Collections.binarySearch(nums,3)); } }如上述代码,向List集合中添加4个数据,然后调用Collections类中的max()和min()方法输出集合中的最大最小元素,replaceAll()替换元素,frequency()判断指定数据在List集合中出现的次数,最后用binarySearch()进行二分法查询。
运行上述程序,执行结果如下:
[2,-5,3,0]
3
-5
[2,-5,3,1]
1
[-5,1,2,3]
3复制
Collections类的copy()静态方法用于将指定集合中的所有元素复制到另一个集合中。执行copy()方法后,目标集合中每个已复制元素的索引将等同于源集合中该元素的索引。
copy()方法的语法格式如下:
voidcopy(Listdest,Listsrc)其中,dest表示目标集合对象,src表示源集合对象。
注意:目标集合的长度至少和源集合的长度相同,如果目标集合的长度更长,则不影响目标集合中的其余元素。如果目标集合长度不够而无法包含整个源集合元素,程序将抛出IndexOutOfBoundsException异常。
例5
在一个集合中保存了5个商品名称,现在要使用Collections类中的copy()方法将其中的3个替换掉。具体实现的代码如下:
publicclassTest5{ publicstaticvoidmain(String[]args){ Scannerinput=newScanner(System.in); ListsrcList=newArrayList(); ListdestList=newArrayList(); destList.add("苏打水"); destList.add("木糖醇"); destList.add("方便面"); destList.add("火腿肠"); destList.add("冰红茶"); System.out.println("原有商品如下:"); for(inti=0;i如上述代码,首先创建了两个List对象srcList和destList,并向destList集合中添加了5个元素,向srcList集合中添加了3个元素,然后调用Collections类中copy()方法将srcList集合中的全部元素复制到destList集合中。由于destList集合中含有5个元素,故最后两个元素不会被覆盖。
运行该程序,具体的执行结果如下所示。
原有商品如下:
苏打水
木糖醇
方便面
火腿肠
冰红茶
输入替换的商品名称:
第1个商品:
燕麦片
第2个商品:
八宝粥
第3个商品:
软面包
当前商品有:
燕麦片 八宝粥 软面包 火腿肠 冰红茶
到此这篇关于JavaCollections类操作集合详解的文章就介绍到这了,更多相关JavaCollections操作集合内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!