一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator

liuyuhang原创,未经允许禁止转载

本文举例使用的是JDK8的API

目录:一点一点看JDK源码(〇)

Comparator为额外实现的比较接口,与类本身无关

该接口在ArrayList的sort中有应用(很多时候都可以用的,只是以此举例)

Comparator接口主要用途有两种,

1、比较有序集合内任意两个元素A、B(完全遍历的compareTo方法,于compare方法内实现)

  若A元素小于B元素,则返回1,donothing

  若A元素等于B元素,则返回0,donothing

  若A元素小于B元素,则返回-1,交换元素位置

  若compare方法的返回值遵循以上原则,则进行排序

  示例代码如下:

 package com.FM.ArrayListStudy;

 import java.util.ArrayList;
import java.util.Comparator; public class ComparatorInArrayListStudy01 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(12);
list.add(3);
list.add(4);
list.add(3);
list.add(11);
list.add(7);
System.out.println(list);//排序之前的list list.sort(new Comparator<Integer>() {//使用Comparator进行自然排序
@Override
public int compare(Integer one, Integer anotherOne) {
int compareTo = one.compareTo(anotherOne);//正序排序
//int compareTo = anotherOne.compareTo(one);//逆序排序 //比较结果为1则不操作
//比较结果为0则相等
//比较结果为-1则交换位置
System.out.println(anotherOne + " -- " + one + " --- " + compareTo);
return compareTo;
}
});
System.out.println(list);//排序之后的list
}
}

运行结果:

2、依照比较的结果(-1,0,1)进行判断分组

  示例代码如下:Apple类

 package com.FM.ArrayListStudy;

 public class Apple {

     private Integer id;
private Integer size; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public Integer getSize() {
return size;
} public void setSize(Integer size) {
this.size = size;
} public Apple(Integer id, Integer size) {
super();
this.id = id;
this.size = size;
} @Override
public String toString() {
return "Apple [id=" + id + ", size=" + size + "]";
} }

  示例代码如下:利用Comparator接口分组

 package com.FM.ArrayListStudy;

 import java.util.ArrayList;
import java.util.Comparator;
import java.util.List; public class ComparatorInArrayListStudy02 {
public static void main(String[] args) {
ArrayList<Apple> list = new ArrayList<Apple>();
list.add(new Apple(1, 81));
list.add(new Apple(2, 76));
list.add(new Apple(3, 91));
list.add(new Apple(4, 84));
list.add(new Apple(5, 79));
list.add(new Apple(6, 87));
list.add(new Apple(7, 85));
list.add(new Apple(8, 83));
list.add(new Apple(9, 91));
System.out.println(list);//排序之前的list List<List<Apple>> disPartList = disPart(list,new Comparator<Apple>(){
@Override
public int compare(Apple o1, Apple o2) {//这里写具体的分组接口,分组方式可以使用对象内的属性的组合方式
if(o1.getSize()/10 == o2.getSize()/10){//将苹果Apple按照size分组,每10个size分为一组
return 0;
}
return 1;
}
});
for(List lis : disPartList){//分别遍历每一组
System.out.println(lis);
}
} /**
* 按照comparator进行分组的方法
*/
public static <T> List<List<T>> disPart(List<T> list, Comparator<? super T> c) {
ArrayList<List<T>> resultList = new ArrayList<List<T>>();
for (T t : list) {
boolean flag = false;
for (int i = 0; i < resultList.size(); i++) {
if (c.compare(t, resultList.get(i).get(0)) == 0) {// 若匹配成功则加入resultList中的子元素
flag = true;
resultList.get(i).add(t);
break;
}
}
if (flag == false) {// 若flag为false则将此元素加入resultList为新元素
List<T> listIn = new ArrayList<T>();
listIn.add(t);
resultList.add(listIn);
}
}
return resultList;
}
}

运行结果:

分组的方式很多,很多人也喜欢自己写遍历来分组

利用好Comparator接口进行分组能更好的重用,也更容易扩展!

 

以上!!

一点一点看JDK源码(五)java.util.ArrayList 后篇之sort与Comparator的更多相关文章

  1. JDK1.8源码(五)——java.util.ArrayList 类

    关于 JDK 的集合类的整体介绍可以看这张图,本篇博客我们不系统的介绍整个集合的构造,重点是介绍 ArrayList 类是如何实现的. 1.ArrayList 定义 ArrayList 是一个用数组实 ...

  2. 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach

    一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...

  3. 一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList

    一点一点看JDK源码(五)java.util.ArrayList 后篇之SubList liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) S ...

  4. 一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历

    一点一点看JDK源码(五)java.util.ArrayList 后篇之Spliterator多线程遍历 liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看J ...

  5. 一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate

    一点一点看JDK源码(五)java.util.ArrayList 后篇之removeIf与Predicate liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点 ...

  6. JDK1.8源码(五)——java.util.Vector类

    JDK1.8源码(五)--java.lang. https://www.cnblogs.com/IT-CPC/p/10897559.html

  7. JDK1.8源码(一)——java.util.ArrayList

      ArrayList 定义 ArrayList 是一个用数组实现的集合,支持随机访问,元素有序且可以重复. public class ArrayList<E> extends Abstr ...

  8. JDK1.8源码(六)——java.util.ArrayList类

    ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Clonea ...

  9. 一点一点看JDK源码(〇)

    一点一点看JDK源码(〇) liuyuhang原创,未经允许进制转载 写在前面: 几乎所有的大神都会强调看源码,也强调源码的重要性: 但是如何看源码,源码看什么?看了什么用?看了怎么用? 困扰很多人, ...

随机推荐

  1. JavaScript对HTML字符转义与反转义(转码和解码)

    HTML的Encode(转码)和解码(Decode)在平时的开发中也是经常要处理的,在这里总结了使用javascript处理HTML的Encode(转码)和解码(Decode)的常用方式 一.用浏览器 ...

  2. COGS2485 从零开始的序列

    传送门 题意:给定一个长为$n$的序列,定义$f(x)$表示所有(长为$x$的区间最小值)的最大值,求$f(1)$~$f(n)$. 看好多人都用并查集做的,然而我并不想写……既然品酒大会可以后缀数组+ ...

  3. MySQL数据备份与还原(mysqldump)

    一 mysqldump指令实现数据备份.mysql指令实现数据还原 经常有朋友问我,DBA到底是做什么的,百科上说:数据库管理员(Database Administrator,简称DBA),是从事管理 ...

  4. Windows核心编程(第5版)----关闭内核对象

    无论怎样创建内核对象,都要向系统指明将通过调用 CloseHandle 来结束对该对象的操作: BOOL CloseHandle(HANDLE hobj); 该函数首先检查调用进程的句柄表,以确保传递 ...

  5. Codeforces Round #411 A. Fake NP

    A. Fake NP time limit per test   1 second memory limit per test   256 megabytes   Tavak and Seyyed a ...

  6. 基于Vue的WebApp项目开发(二)

    利用webpack解析和打包.vue组件页面 相关知识: vue项目中的每个页面其实都是一个.vue的文件,这种文件,Vue称之为组件页面,必须借助于webpack的vue-loader才能运行,所以 ...

  7. 爬虫入门之Scrapy框架基础框架结构及腾讯爬取(十)

    Scrapy终端是一个交互终端,我们可以在未启动spider的情况下尝试及调试代码,也可以用来测试XPath或CSS表达式,查看他们的工作方式,方便我们爬取的网页中提取的数据. 如果安装了 IPyth ...

  8. 基于腾讯云centos简单搭建VSFTP

    基于腾讯云centos7.3搭建VSFTP 环境分析: 基于vsftp服务在于云主机上,所以推荐使用FTP的PASV模式: FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动 ...

  9. 通过CXF,开发rest协议接口

    1. 引入cxf的jar包 pom文件里面直接增加依赖 < dependency> <groupId > junit</ groupId> <artifact ...

  10. Geekforgeek week1

    1. is palindrome solution 1: check to reverse the digit, if they are the same number https://www.gee ...