Java—集合框架 Collections.sort()、Comparable接口和Comparator接口
- Collentions工具类--java.util.Collections
Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List、Map和Set是并列的。
Collections.sort() 排序方法,实现对List对象中的元素进行排序.
package com.test.collection; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random; public class CollectionsTest { /**
* Integer泛型的List进行排序
*/
public void testSort1(){
List<Integer> integerList = new ArrayList<Integer>();
//插入10个100以内不重复的随机整数
Random random = new Random();
Integer num;
for (int i = 0; i < 10; i++) {
do {
num = random.nextInt(100);
} while(integerList.contains(num));
integerList.add(num);
System.out.println("成功插入整数:" + num);
}
System.out.println("==============排序前=============");
for (Integer integer : integerList) {
System.out.print(integer + " ");
}
//调用Collections.sort()方法排序
Collections.sort(integerList);
System.out.println("==============排序后=============");
for (Integer integer : integerList) {
System.out.print(integer + " ");
}
}
/**
* String泛型的List进行排序
* 字符串类型进行比较,先数字后字母,数字0-9,字母A-Za-z
*/
public void testSort2() {
List<String> stringList = new ArrayList<String>();
//添加3个乱序的String元素
stringList.add("google");
stringList.add("lenovo");
stringList.add("baidu");
System.out.println("==============排序前=============");
for (String string : stringList) {
System.out.println(string);
}
Collections.sort(stringList);
System.out.println("==============排序后=============");
for (String string : stringList) {
System.out.println(string);
}
} public static void main(String[] args) {
CollectionsTest ct = new CollectionsTest();
ct.testSort1();
ct.testSort2();
} }
- Comparable接口和Comparator接口
在Java中,如果两个对象需要进行排序,那么它们必须是可以比较的。用Comparable这个接口表示某个对象是可以比较的。Comparable相当于给对象定义了默认的排序规则,而如果改用其他规则进行排序,可用Comparator接口,它定义了临时比较规则。Comparable接口和Comparator接口,都是Java集合框架的成员。
Comparable接口:
- 实现该接口表示:这个类的实例可以比较大小,可以进行自然排序;
- 定义了默认的比较规则
- 其 实现类需实现compareTo()方法
- Obja.compareTo(Obj2)方法返回正数表示a比b大,负数表示a比b小,0表示a和b相等
Comparator接口:
- 用于定义临时比较规则,而不是默认比较规则
- 其 实现类需要实现compare()方法
- 用法:
Collections.sort(List<T> list, Comparator<? super T> c),根据指定比较器产生的顺序对指定列表进行排序。
实例:学生系列排序,默认按学生id来排序,先随机生成3个不相同的1000以内的整数做为学生的id;然后再按学生姓名来排序。
package com.test.collection; import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random; public class CollectionsTest { public void testSort() {
List<Student> studentList = new ArrayList<Student>();
List<Integer> studentId = new ArrayList<Integer>();
Random random = new Random();
Integer num;
for (int i = 0; i < 3 ; i++) {
do {
num = random.nextInt(1000);
} while (studentId.contains(num));
studentId.add(num);
} studentList.add(new Student(studentId.get(0) + "", "Tom"));
studentList.add(new Student(studentId.get(1) + "", "Jack"));
studentList.add(new Student(studentId.get(2) + "", "Xiaoming"));
studentList.add(new Student(1000 + "", "Lily")); System.out.println("===========排序前=============");
for (Student student : studentList) {
System.out.println("学生:" + student.id + "——" + student.name);
}
Collections.sort(studentList);
System.out.println("===========按照id排序后=============");
for (Student student : studentList) {
System.out.println("学生:" + student.id + "——" + student.name);
}
System.out.println("===========按照姓名排序后========");
Collections.sort(studentList, new StudentComparator());
for (Student student : studentList) {
System.out.println("学生:" + student.id + "——" + student.name);
}
} public static void main(String[] args) {
CollectionsTest ct = new CollectionsTest();
ct.testSort();
} }
执行结果:
===========排序前=============
学生:118——Tom
学生:460——Jack
学生:51——Xiaoming
学生:1000——Lily
===========排序后=============
学生:1000——Lily
学生:118——Tom
学生:460——Jack
学生:51——Xiaoming
===========按照姓名排序后========
学生:460——Jack
学生:1000——Lily
学生:118——Tom
学生:51——Xiaoming
其中,Student类需要实现Comparable接口的compareTo()方法,StudentComparator类需要实现Comparator接口的compare()方法:
Student.java
package com.test.collection; import java.util.HashSet;
import java.util.Set;
/**
* 学生类
* @author Administrator
*
*/
public class Student implements Comparable<Student> {
public String id;
public String name;
public Set<Course> courses;//所选课程
public Student(String id, String name) {
this.id = id;
this.name = name;
this.courses = new HashSet<Course>();//实例化sourses(Set是接口,接口不能被直接实例化)
}
@Override
public int compareTo(Student o) {
return this.id.compareTo(o.id);
}
}
StudentComparator.java
package com.test.collection; import java.util.Comparator; public class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
return o1.name.compareTo(o2.name);
}
}
Java—集合框架 Collections.sort()、Comparable接口和Comparator接口的更多相关文章
- java集合框架(Collections Framework)
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- Java集合框架Collections【List/Set】
1.基本介绍: 集合就是存放对象的,他比数组好的一点就是他一开始不清楚自己长度 容器一般是分为很多种的,很多的容器在一起然后进过断的抽象和抽取就成了一个体系,我们称之为集合框架 我们看体系首先是看顶层 ...
- Java集合框架之Set接口浅析
Java集合框架之Set接口浅析 一.java.util.Set接口综述: 这里只对Set接口做一简单综述,其具体实现类的分析,朋友们可关注我后续的博文 1.1Set接口简介 java.util.se ...
- 浅入深出之Java集合框架(下)
Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...
- java 集合框架小结
一:集合框架 集合框架是为表示和操作集合而规定的一种统一的标准的体系结构. 任何集合框架都包含三大块内容:对外的接口.接口的实现和对集合运算的算法. 接口:即表示集合的抽象数据类型.Colle ...
- python 中的sort 和java中的Collections.sort()函数的使用
x=[1,2,3] x.sort()对的,x这个都变了 y=x.sort()错误 y=sorted(x)对的,x拍好序的一个副本 python中用匿名函数和自定义函数排序:(很奇怪的是比较函数返回的是 ...
- Java—集合框架List
集合的概念 现实生活中:很多的事物凑在一起 数学中的集合:具有共同属性的事物的总和 Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象 集合的作用 在类的内部,对数据进行组 ...
- (Set, Map, Collections工具类)JAVA集合框架二
Java集合框架部分细节总结二 Set 实现类:HashSet,TreeSet HashSet 基于HashCode计算元素存放位置,当计算得出哈希码相同时,会调用equals判断是否相同,相同则拒绝 ...
- 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合
不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...
随机推荐
- let 和 var 的区别笔记
参考文章:阮一峰 ECMAScript 6 入门 ES6中新增加了 let 声明,它跟 var 的区别如下: 1.作用域不同,let 只在代码块中有效 { var a = '123'; le ...
- Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)
题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...
- P3813 [FJOI2017]矩阵填数
传送门 矩阵很大,但是发现 $n$ 很小,从这边考虑,对于一个一堆小矩阵放在一起的情况 考虑把每一块单独考虑然后方案再乘起来 但是这些奇怪的东西很不好考虑 所以暴力一点,直接拆成一个个小块 但是这样我 ...
- HDU - 1588 矩阵前缀和
题意:给定\(k,b,n,m\),求\(\sum_{i=0}^{n-1}f(g(i))\) 其中\(f(i)=f(i-1)+f(i-2),f(1)=1,f(0)=0\),\(g(i)=k*i+b\) ...
- [转] Kubernetes K8S 简介
[From] https://blog.csdn.net/zhangxxxww/article/details/73547251 Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括 ...
- HTTP security headers 安全头例子
这是从以下网站测试得到的结果,参考测试项目可以知道哪些安全头应该如何设置. https://observatory.mozilla.org/analyze.html?host=appcanary.co ...
- PIE SDK定向滤波
1. 算法功能简介 定向滤波又称为匹配滤波,是通过一定尺寸的方向模板对图像进行卷积计算,并以卷积值代替各像元点灰度值,强调的是某一些方向的地面形迹,例如水系.线性影像等. 方向模板是一个各元素大小按照 ...
- spark第十八篇:Tuning Spark 调优
由于大多数Spark应用都是在内存中计算的,所以,Spark程序的瓶颈可能是集群中的任何资源,比如CPU,网络带宽或者内存等.本指南主要涵盖两个主题: 1.数据序列化.这对于良好的网络性能至关重要,还 ...
- journalctl 中文手册
版权声明 本文译者是一位开源理念的坚定支持者,所以本文虽然不是软件,但是遵照开源的精神发布. 无担保:本文译者不保证译文内容准确无误,亦不承担任何由于使用此文档所导致的损失. 自由使用:任何人都可以自 ...
- 牛客网Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤
福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号: 大数据躺过的坑 Java从入门到架构师 人工智能躺过的坑 Java全栈大联盟 ...