Java开发笔记(七十一)容器工具Collections

清单作为一组数据的有序队列,它在组织形式上与数组有着某些异曲同工之处,数组有专门的数组工具Arrays来进行加工操作,照理清单也应该配备对应的清单工具。当然容器这个大家族确实拥有自己的容器工具Collections,不过数组工具Arrays也隐藏着一个清单方法,它便是asList,该方法类似数组的初始赋值,同样支持把括号内部的一系列数据直接转为清单对象。前面介绍泛型类和泛型接口的时候,就利用Arrays.asList给某个清单实例进行了初始化赋值,不过调用asList得到的数组大小是固定的,无法进行add、remove等增删操作。
除了Arrays工具的asList方法,其余的清单加工方法全归Collections了。首先值得一提的依然是最常用的sort排序方法,Collections的soort方法与Arrays的同名方法一样,都采用比较器Comparator对指定数组或清单完成排序操作,并且它俩的代码用法极其相似。比如下面便是采取匿名内部类方式对某清单做排序的代码例子:

	// 演示如何给清单排序
	private static void testSort() {
		List<Apple> appleList = getAppleList();
		// 匿名内部类方式给清单排序。按照苹果的重量升序排列
		Collections.sort(appleList, new Comparator<Apple>() {
			@Override
			public int compare(Apple o1, Apple o2) {
				return o1.getWeight().compareTo(o2.getWeight());
			}
		});
		System.out.println("排序后的苹果清单="+appleList.toString());
	}

 

运行以上的排序代码,观察日志结果可知处理后的清单果然按照苹果的重量升序排列了。

排序后的苹果清单=[
(name=红苹果,color=green,weight=100.000000,price=10.000000), 
(name=红苹果,color=RED,weight=150.000000,price=10.000000), 
(name=大苹果,color=yellow,weight=200.000000,price=10.000000), 
(name=大苹果,color=green,weight=250.000000,price=10.000000), 
(name=大苹果,color=Red,weight=250.000000,price=10.000000), 
(name=红苹果,color=red,weight=300.000000,price=10.000000)]

 

清单的排序代码也可改写为Lambda表达式,从而更简洁更高效,修改后的排序代码如下所示。

		// Lambda表达式给清单排序
		Collections.sort(appleList, 
				(o1, o2) -> o1.getWeight().compareTo(o2.getWeight()));

 

其次是求最大值元素的max方法,以及求最小值元素的min方法。虽然排序后的清单很容易获得最大值和最小值,例如升序情况下最后一个元素就为最大值,且第一个元素就为最小值,但是毕竟得先经过排序的步骤,所谓多一事不如少一事,倘若能够直接获取最大元素和最小元素,那有何乐而不为呢?max方法和min方法的使用很简单,仍旧是指定待取数的清单实例,以及判断大小的比较器实例即可。通过max和min求某清单最大与最小元素的代码示例如下:

	// 演示如何获取最大值和最小值
	private static void testMaxAndMin() {
		List<Apple> appleList = getAppleList();
		// Lambda表达式获取容器的最大值。求最重的苹果
		Apple heavestApple = Collections.max(appleList, 
				(o1, o2) -> o1.getWeight().compareTo(o2.getWeight()));
		System.out.println("最重的苹果="+heavestApple.toString());
		// Lambda表达式获取容器的最小值。求最轻的苹果
		Apple lightestApple = Collections.min(appleList, 
				(o1, o2) -> o1.getWeight().compareTo(o2.getWeight()));
		System.out.println("最轻的苹果="+lightestApple.toString());
	}

 

运行上述求最大值和最小值的代码,观察下列的输出日志,可见正确求得了最大和最小元素。

最重的苹果=
(name=红苹果,color=red,weight=300.000000,price=10.000000)
最轻的苹果=
(name=红苹果,color=green,weight=100.000000,price=10.000000)

 

除了sort、max和min方法,Collections的还提供了fill和swap方法,其中前者用于给指定清单填满某元素,而后者用于交换清单中两个元素的位置。



更多Java技术文章参见《Java开发笔记(序)章节目录

posted @ 2019-03-13 22:12  pinlantu  阅读(252)  评论(0编辑  收藏  举报