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

Java开发笔记(七十一)容器工具Collections的更多相关文章

  1. Java开发笔记(十一)常见的数学函数

    前面介绍了Java编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≍.求绝对值的“| |”.开平方的“√ ̄”,这些运算符形态各异,而且并非ASCII码 ...

  2. Java开发笔记(序)章节目录

    现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...

  3. Java开发笔记(四十一)日历工具Calendar

    前面的文章提到,Date是Java最早的日期工具,估计当时的设计师是个技术宅男,未经过充分调研就拍脑袋写下了Date的源码,造成该工具存在先天不足,比如getYear方法返回的不是纯正的公元纪年.ge ...

  4. Java开发笔记(七十二)Java8新增的流式处理

    通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...

  5. Java开发笔记(三十九)日期工具Date

    Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...

  6. Java开发笔记(四十二)日历工具的常见应用

    前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,似乎没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的作用大着呢,接 ...

  7. Java开发笔记(七十)Java8新增的几种泛型接口

    由于泛型存在某种不确定的类型,因此很少直接运用于拿来即用的泛型类,它更经常以泛型接口的面目出现.例如几种基本的容器类型Set.Map.List都被定义为接口interface,像HashSet.Tre ...

  8. Java开发笔记(七十三)常见的程序异常

    一个程序开发出来之后,无论是用户还是程序员,都希望它稳定地运行,然而程序毕竟是人写的,人无完人哪能不犯点错误呢?就算事先考虑得天衣无缝,揣着一笔巨款跑去岛国买了栋抗震性能良好的海边别墅,谁料人算不如天 ...

  9. Java开发笔记(八十一)如何使用系统自带的注解

    之前介绍继承的时候,提到对于子类而言,父类的普通方法可以重写也可以不重写,但是父类的抽象方法是必须重写的,如果不重写,编译器就直接在子类名称那里显示红叉报错.例如,以前演示抽象类用法之时,曾经把Chi ...

随机推荐

  1. linux 使用sh@d0ws0cks client

    Linux Centos7下安装使用Shadowsocks客户端,实现*** 准备 SS: 搭建一个可以连接外网的服务器 教程可见 自己动手搭梯子 服务器:本人用的腾讯云服务器,系统为Centos7 ...

  2. Mesos源码分析(12): Mesos-Slave接收到RunTask消息

    在前文Mesos源码分析(8): Mesos-Slave的初始化中,Mesos-Slave接收到RunTaskMessage消息,会调用Slave::runTask.   void Slave::ru ...

  3. 回顾4180天在腾讯使用C#的历程,开启新的征途

    今天是2018年8月8日,已经和腾讯解除劳动关系,我的公司正式开始运营,虽然还有很多事情需要理清,公司官网也没有做,接下来什么事情都需要自己去完成了,需要一步一个脚印去完善,开启一个新的征途,我将在博 ...

  4. Lesson 26 The best art critics

    Text I am an art student and I paint a lot of pictures. Manay people pretend that they understand mo ...

  5. NeuChar 平台使用及开发教程(二):设置平台账号

    在上一篇<NeuChar 平台使用及开发教程(一):开始使用 NeuChar>中我们了解了 NeuChar 的角色和大体功能框架,并进行了注册,本文将介绍如何设置多账号,以便让 NeuCh ...

  6. React Native 填坑之神奇的报错,已解决

    下面对报错进行一下详细描述: 在debug时,点着点着,就会发生: 1.手机显示如下 : Attempted to transition from state `RESPONDER_INACTIVE_ ...

  7. emWin收音机,含uCOS-III和FreeRTOS两个版本

    第11期:收音机配套例子:V6-919_STemWin提高篇实验_收音机(uCOS-III)V6-920_STemWin提高篇实验_收音机(FreeRTOS) 例程下载地址: http://forum ...

  8. 美图App的移动端DNS优化实践:HTTPS请求耗时减小近半

    本文引用了颜向群发表于高可用架构公众号上的文章<聊聊HTTPS环境DNS优化:美图App请求耗时节约近半案例>的部分内容,感谢原作者. 1.引言 移动互联网时代,APP 厂商之间的竞争非常 ...

  9. [IOI2007] sails 船帆

    显然答案与杆的顺序无关(按每个高度考虑). 从高到低考虑杆,设此时的状态为\(S\),\(S[i]\)是高度\(i\)的帆的数目,初始全为\(0\),当前杆的高度为\(h\),杆上需要放置的帆的数目为 ...

  10. C# 当中 LINQ 的常规用法(Lambda 方式)

    仅以本篇博文记录 LINQ 相关操作的基本知识,原型参考自 MSDN 相关知识,中间加以自己的理解与 DEMO. 1. IEnuemrable<T>.Select() Select 方法比 ...