清单作为一组数据的有序队列,它在组织形式上与数组有着某些异曲同工之处,数组有专门的数组工具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开发笔记(序)章节目录》