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 ...
随机推荐
- 如何在mysql客户端即mysql提示符下执行操作系统命令
环境描述: mysql版本:5.5.57-log 操作系统版本:Red Hat Enterprise Linux Server release 6.6 (Santiago) 需求描述: 在mysql的 ...
- angular.js学习笔记(一)
1.angular单项数据绑定 2.不要使用控制器的时候: 任何形式的DOM操作:控制器只应该包含业务逻辑.DOM操作则属于应用程序的表现层逻辑操作,向来以测试难度之高闻名于业界.把任何表现层的逻辑放 ...
- [Swift]LeetCode318. 最大单词长度乘积 | Maximum Product of Word Lengths
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...
- Spring之AOP流程解析(ProxyFactory)
本节我们从ProxyFactory开始分析.该类有几个比较重要的方法——addAdvice.addAdvisor.getProxy,其中最后一个方法是我们本节的重点.前两个方法都是向ProxyFact ...
- 浅谈Java内存模型
Java内存模型虽说是一个老生常谈的问题 ,也是大厂面试中绕不过的,甚至初级面试也会问到.但是真正要理解起来,还是相当困难,主要这个东西看不见,摸不着.网上已经有大量的博客,但是人家的终究是人家的,自 ...
- 微信小程序代码构成
一.小程序代码 app.json 是当前小程序的全局配置,包括了小程序的所有页面路径.界面表现.网络超时时间.底部tab等. { "pages":[ "pages/ind ...
- Mac版AppStore无法下载、升级错误处理
在mac版本AppStore下载软件的时候,有时会出现"This item is temporarily unavailable, Try again later"错误提示,当然等 ...
- 洛谷:P1182:数列分段`Section II`
题目描述 对于给定的一个长度为N的正整数数列 A-iA−i ,现要将其分成 M(M≤N)M(M≤N) 段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列 4 2 4 5 1424 ...
- Kafka~Linux环境下的部署
概念 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据. 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素. 这些数据 ...
- linux(centos)搭建.net core 运行环境
总的来说,非常简单,我记录一下: 1.打开https://www.microsoft.com/net/download?initial-os=linux 这里"Instal .NET C ...