一点一点看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. 各种常用的JSON接口

    这里为大家搜集了一些能够返回JSON格式的服务接口.部分需要用JSONP调用. 其中一些接口提供用例参照:http://www.bejson.com/webInterface.php 天气接口 气象局 ...

  2. 比较全的css重设

    一.最简化的CSS Reset(重设) : * { padding:; margin:; } 这是最普遍最简单的CSS重设,将所有元素的padding和margin值都设为0,可以避免一些浏览器在理解 ...

  3. cf1043F. Make It One(dp 容斥原理)

    题意 题目链接 给出\(n\)个数,问最少选几个数,使他们的\(gcd = 1\) Sol 好神仙啊qwq. 首先,如果答案存在,那么最多为\(7\)(因为前\(7\)个质数乘起来\(>= 3e ...

  4. AngularJs动态添加元素和删除元素

    动态添加元素和删除元素 //通过$compile动态编译html var html="<div ng-click='test()'>我是后添加的</div>" ...

  5. Linux基础之-网络配置,主机名设置,ssh登陆,scp传输

    一. 网络配置修改 1.临时修改(ip,dns,netmask,gateway) 临时修改网络配置,只要没有涉及到修改配置文件的,在network服务重启后,所有设置失效 2.永久修改(ip,dns, ...

  6. [小北De编程手记] : Lesson 05 - Selenium For C# 之 API 下

    上一篇,我们介绍了一些Selenium WebDriver相关的API,下面我们就接着上一篇继续介绍Selenium常用的API,这一篇的内容主要涉及到以下话题: Selenium API:复杂事件处 ...

  7. 10_Redis实现分布式锁

    来源:吴兆锋, https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/ 前言 分布式锁一般有三种实现方式:1. 数据库乐观锁: ...

  8. atoi、itoa,strcpy,strcmp,memcpy等实现

    原文:http://www.cnblogs.com/lpshou/archive/2012/06/05/2536799.html 1.memcpy.memmove.memset源码 link:http ...

  9. 【 Oral English】Pronunciation

    一.英语音素 1.元音(元首,主要部分) 特点: a.无阻碍,拖很长认可辨别 b.声音响亮 2.辅音(重点,刻意练习) 特点: a.刻意阻碍 b.短促 二.汉语元素 1.音节:最小组成成分,而非元/辅 ...

  10. linux 获取当前程序路径

    const std::string strCfgName = "logger_import_db.conf" ;bool fGetCfgFileName(std::string&a ...