一点一点看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. 深入理解jQuery插件开发总结(一)

    由于这篇文章比较长,所以分了四个阶段讲,从简单的入门级到最后到综合级,有些列子和图片都是转载其他博主的,希望对想写插件对同学会有帮助.这里分享个好久之前写的一个jquery插件(网站的功能引导插件,思 ...

  2. Python-网络编程(一)

    首先我们python基础部分已经学完了,而socket是我们基础进阶的课程,也就是说,你自己现在完全可以写一些小程序了,但是前面的学习和练习,我们写的代码都是在自己的电脑上运行的,虽然我们学过了模块引 ...

  3. Python入门-初始函数

    今天让我们来初步认识一个在python中非常重要的组成部分:函数 首先,让我们来幻想这样一个场景: 比如说我们现在想要通过社交软件约一个妹子,步骤都有什么? print('打开手机 ') print( ...

  4. Perl学习笔记(3)----遍历哈希表的一个容易疏忽的地方

    今天做 Google的 Code Jam 上的一道题目:https://code.google.com/codejam/contest/351101/dashboard#s=p2,用Perl语言解答的 ...

  5. Docker常用操作指令

    1.查看正在运行的容器 docker ps 2.查看所有容器 docker ps -a 3.停用所有正在运行的容器 docker stop $(docker ps -q) 4.删除所有容器 docke ...

  6. asp.net怎么让某一页的 requestEncoding设置成utf-8

    web.config里是这样的 <globalization requestEncoding="gb2312" responseEncoding="gb2312&q ...

  7. Android GridView设置行数

    普通的做法是设置一个高度,然后里面能显示出来几行就是几行,如果里面的内容高度变了,就需要重新调整高度来适配. 观察了一下它的onMeasure @Override protected void onM ...

  8. QT 编译遇到重定义;不同的基类型&在QT中使用C++ lib库

    最近在使用osg和qt开发,在集成osg时候因为我使用的qt版本为非opengl的版本,导致qt自己封了一遍opengl的一些基类变量如double 这时候就会跟osg中声明的opengl的类型冲突, ...

  9. Java—IO流 对象的序列化和反序列化

    序列化的基本操作 1.对象序列化,就是将Object转换成byte序列,反之叫对象的反序列化. 2.序列化流(ObjectOutputStream),writeObject 方法用于将对象写入输出流中 ...

  10. Netty相关面试题

    1.BIO.NIO和AIO的区别? BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理.线程开销大. 伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源. N ...