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开发笔记(序)章节目录》
Java开发笔记(七十一)容器工具Collections的更多相关文章
- Java开发笔记(十一)常见的数学函数
前面介绍了Java编程的四则运算,虽然提供了基础的加减乘除符号,但是数学上还有其它运算符号,包括四舍五入用到的约等号≍.求绝对值的“| |”.开平方的“√ ̄”,这些运算符形态各异,而且并非ASCII码 ...
- Java开发笔记(序)章节目录
现将本博客的Java学习文章整理成以下笔记目录,方便查阅. 第一章 初识JavaJava开发笔记(一)第一个Java程序Java开发笔记(二)Java工程的帝国区划Java开发笔记(三)Java帝国的 ...
- Java开发笔记(四十一)日历工具Calendar
前面的文章提到,Date是Java最早的日期工具,估计当时的设计师是个技术宅男,未经过充分调研就拍脑袋写下了Date的源码,造成该工具存在先天不足,比如getYear方法返回的不是纯正的公元纪年.ge ...
- Java开发笔记(七十二)Java8新增的流式处理
通过前面几篇文章的学习,大家应能掌握几种容器类型的常见用法,对于简单的增删改和遍历操作,各容器实例都提供了相应的处理方法,对于实际开发中频繁使用的清单List,还能利用Arrays工具的asList方 ...
- Java开发笔记(三十九)日期工具Date
Date是Java最早的日期工具,编程中经常通过它来获取系统的当前时间.当然使用Date也很简单,只要一个new关键字就能创建日期实例,就像以下代码示范的那样: // 创建一个新的日期实例,默认保存的 ...
- Java开发笔记(四十二)日历工具的常见应用
前面介绍了日历工具Calendar的基本用法,乍看起来Calendar与Date两个半斤八两,似乎没有多大区别,那又何苦庸人自扰鼓捣一个新玩意呢?显然这样小瞧了Calendar,其实它的作用大着呢,接 ...
- Java开发笔记(七十)Java8新增的几种泛型接口
由于泛型存在某种不确定的类型,因此很少直接运用于拿来即用的泛型类,它更经常以泛型接口的面目出现.例如几种基本的容器类型Set.Map.List都被定义为接口interface,像HashSet.Tre ...
- Java开发笔记(七十三)常见的程序异常
一个程序开发出来之后,无论是用户还是程序员,都希望它稳定地运行,然而程序毕竟是人写的,人无完人哪能不犯点错误呢?就算事先考虑得天衣无缝,揣着一笔巨款跑去岛国买了栋抗震性能良好的海边别墅,谁料人算不如天 ...
- Java开发笔记(八十一)如何使用系统自带的注解
之前介绍继承的时候,提到对于子类而言,父类的普通方法可以重写也可以不重写,但是父类的抽象方法是必须重写的,如果不重写,编译器就直接在子类名称那里显示红叉报错.例如,以前演示抽象类用法之时,曾经把Chi ...
随机推荐
- Educational Codeforces Round 8
开始填坑_(:з」∠)_ 628A - Tennis Tournament 20171124 小学数学题,\((x,y)=((n-1)\cdot(2b+1),np)\) #include< ...
- PLC不能初始化问题
检索COM 类工厂中 CLSID 为 <28e68f9a-8d75-11d1-8dc3-3c302a000000> 的组件时失败,原因是出现以下错误: 80040154 解决方案: Win ...
- linux学习:网络(防火墙)及系统安全相关命令学习
指令: top.htop.free.pstree.lsof.ifconfig.w3m.tcpdump.netstat.nmap.ufw 网络: top #查看内存,cpu,进程之间的状态.hto ...
- 百度AI
官网:http://ai.baidu.com/tech/face SDK:https://ai.baidu.com/sdk#bfr API说明 百度Face SDK Android 版是一种面向 An ...
- ndk编译faac生成库
1.编译脚本如下: NDK=/opt/android-ndk-r9d TOOLCHAIN=$NDK/toolchains/arm-linux-androideabi-4.6/prebuilt/linu ...
- FFmpeg 学习(五):FFmpeg 编解码 API 分析
在上一篇文章 FFmpeg学习(四):FFmpeg API 介绍与通用 API 分析 中,我们简单的讲解了一下FFmpeg 的API基本概念,并分析了一下通用API,本文我们将分析 FFmpeg 在编 ...
- [Swift]LeetCode365. 水壶问题 | Water and Jug Problem
You are given two jugs with capacities x and y litres. There is an infinite amount of water supply a ...
- Python——day11 函数(对象、名称空间、作用域、嵌套、闭包)
一.函数对象 函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象 函数对象的应用 1. 可以直接被引用 fn = cp_fn 2 .可以当作函数参数传递 c ...
- Volatile的那些事
上一篇中,我们了解了Synchronized关键字,知道了它的基本使用方法,它的同步特性,知道了它与Java内存模型的关系,也明白了Synchronized可以保证"原子性",&q ...
- InstallShield Limited Edition Project 打包windows服务解析
最近项目从vs2005 升级到vs2010后,发现新的vs2010 不再带有原来的安装工程项目,导致以前的安装包不可以使用,查找资料后发现微软从vs2010 版本后不再提供自带的安装工程,尝试着利用 ...