1:对象实现Comparable, 那么对象就具有了比较功能

package comparableAndComparator;

import java.util.Collections;
import java.util.LinkedList; /**
* @program: GradleTestUseSubModule
* @author: Yafei Li
* @create: 2018-09-10 16:18
**/
public class Main {
public static void main(String[] args){
LinkedList<Person> linkedList = new LinkedList<>();
linkedList.add(new Person("wangwu"));
linkedList.add(new Person("lisi"));
linkedList.add(new Person("zhangsan"));
linkedList.stream().forEach(person -> {
System.out.println(person.name);
});
Collections.sort(linkedList);
System.out.println("--------------------------");
linkedList.stream().forEach(person -> {
System.out.println(person.name);
});
}
} class Person implements Comparable<Person>{ public String name; public Person(String name) {
this.name = name;
} public int compareTo(Person person) {
return person.name.compareTo(name);
}
}

结果:

wangwu
lisi
zhangsan
--------------------------
zhangsan
wangwu
lisi

2:单独定义一个比较器,用于比较Person对象

package comparableAndComparator;

import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedList; /**
* @program: GradleTestUseSubModule
* @author: Yafei Li
* @create: 2018-09-10 16:18
**/
public class Main {
public static void main(String[] args){
LinkedList<Person> linkedList = new LinkedList<>();
linkedList.add(new Person("wangwu"));
linkedList.add(new Person("lisi"));
linkedList.add(new Person("zhangsan"));
linkedList.stream().forEach(person -> {
System.out.println(person.name);
});
Collections.sort(linkedList,new PersonComparator());
System.out.println("--------------------------");
linkedList.stream().forEach(person -> {
System.out.println(person.name);
});
}
} class Person{ public String name; public Person(String name) {
this.name = name;
}
} class PersonComparator implements Comparator<Person>{
public int compare(Person p1, Person p2) {
return p1.name.compareTo(p2.name);
}
}

结果:

wangwu
lisi
zhangsan
--------------------------
lisi
wangwu
zhangsan

3:使用比较器对 map进行排序

package com.li.jingdong;

import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Stream; /**
* @program: GradleTestUseSubModule
* @author: Yafei Li
* @create: 2018-09-10 10:37
**/
public class Main5 { public static void salaryfrequeny(int num,int[] salaries) throws NoSuchFieldException, IllegalAccessException {
Map<Integer, Integer> map = new LinkedHashMap<>();
for (int i = 0; i < num; i++) {
map.computeIfPresent(salaries[i],(k,v)->{
return v+1;
});
map.putIfAbsent(salaries[i], 1);
}
Map<Integer, Integer> sortMap = sortByKey(map);
System.out.println(sortMap);
} //根据值对map进行排序
public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
Map<K, V> result = new LinkedHashMap<>();
Stream<Map.Entry<K, V>> st = map.entrySet().stream();
st.sorted(Comparator.comparing(e -> e.getValue())).forEach(e -> result.put(e.getKey(), e.getValue()));
return result;
}
//根据键对map排序
public static <K extends Comparable,V> Map<K,V> sortByKey(Map<K,V> map) {
Map<K, V> resultMap = new LinkedHashMap<>();
Stream<Map.Entry<K, V>> stream = map.entrySet().stream();
//(a,b)->b.getKey().compareTo(a.getKey()) 是一个比较器
stream.sorted((a,b)->b.getKey().compareTo(a.getKey())).forEach(e->{ //e就是挨个取出map中的Entry,
System.out.println("key:"+e.getKey()+" value:"+e.getValue());
resultMap.put(e.getKey(), e.getValue());
});
return resultMap;
} public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException { int n=5;
int[] salary = {1000, 2000, 1000, 3000, 2000};
salaryfrequeny(n,salary);
}
}

4:通过反射O(1)的时间获取LinkedHashMap的尾节点

            Map<Integer, Integer> map = new LinkedHashMap<>();
Field tail = map.getClass().getDeclaredField("tail");
tail.setAccessible(true);
Map.Entry<Integer,Integer> entry=(Map.Entry<Integer, Integer>) tail.get(map);
Integer key = entry.getKey();
Integer value = entry.getValue();

Comparable和Comparator的使用的更多相关文章

  1. Java中Comparable与Comparator的区别

    相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...

  2. 对象比较器:Comparable和Comparator

    在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator ①.java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个co ...

  3. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  4. Comparable和Comparator的区别

    Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...

  5. Java中Comparable和Comparator区别小结

    一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...

  6. Java 中 Comparable 和 Comparator 比较

    Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...

  7. Comparable与Comparator

    转载 Comparable与Comparator的区别 (转载) Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部 ...

  8. Java中的TreeMap、Comparable、Comparator

    我们知道HashMap的存储位置是按照key这个对象的hashCode来存放的,而TreeMap则是不是按照hashCode来存放,他是按照实现的Comparable接口的compareTo这个方法来 ...

  9. 比较器comparable与comparator的使用

    在Java学习和使用里,工具类与算法类(collections和Arrays)也是我们使用比较多的,在它们里面就包含了comparable与comparator这两种比较器. 一.比较器的分类与概念 ...

  10. 简谈Comparable和Comparator区别

    对于Comparable和Comparator这连个相似的接口,还是做一下比较比较好: Comparable Comparator (1)只包含一个compareTo()方法,此方法可以给两个对象排序 ...

随机推荐

  1. 利用pdb获取未导出符号

      BOOL InitSymHandler(HANDLE hProc)   {   CHAR SymPath[MAX_PATH], CurDir[MAX_PATH];       GetCurrent ...

  2. Android textview及其子类

    属性: android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web/email/phone/map/all) andr ...

  3. mFC 橡皮线

    一般都用GDI实现: void CXiangpijinView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message ...

  4. [Offer收割]编程练习赛15 B.分数调查[加权并查集]

    #1515 : 分数调查 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi的学校总共有N名学生,编号1-N.学校刚刚进行了一场全校的古诗文水平测验. 学校没有公布测 ...

  5. 安装cnpm

    使用淘宝镜像的cnpm $ npm install -g cnpm --registry=https://registry.npm.taobao.org

  6. 关于virgo-tomcat-server-3.6.0.RELEASE配置文件修改说明

    Virgo项目Web服务器是EclipseRT项目的一部分,是一个完全模块化的Java运行时. Virgo自身就是设计为在标准OSGi框架实现(Equinox)之上的一个OSGi bundle集合. ...

  7. 【CF908G】New Year and Original Order 数位DP

    [CF908G]New Year and Original Order 题意:令S(i)表示将i中所有数位上的数拿出来,从小到大排序后组成一个新的数的值.如S(50394)=3459.求$\sum\l ...

  8. [工具] Snipaste

    https://zh.snipaste.com/ Snipaste 是一个简单但强大的截图工具,也可以让你将截图贴回到屏幕上! 下载并打开 Snipaste,按下 F1 来开始截图, 选择“复制到剪贴 ...

  9. css如何设置label的字间距

    css.html如何设置label的字间距 .myClass  label{ letter-spacing: 10px; } 如果label需要居中,需加上 text-indent: 10px; 首行 ...

  10. html如何引用另一个html的内容

    第一种:使用jquery: https://api.jquery.com/load/ 这可以加载html中某个id的元素 $( "#result" ).load( "aj ...