Comparable和Comparator的使用
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的使用的更多相关文章
- Java中Comparable与Comparator的区别
		
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
 - 对象比较器:Comparable和Comparator
		
在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator ①.java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个co ...
 - Java中Comparable和Comparator接口区别分析
		
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
 - Comparable和Comparator的区别
		
Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...
 - Java中Comparable和Comparator区别小结
		
一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...
 - Java 中 Comparable 和 Comparator 比较
		
Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...
 - Comparable与Comparator
		
转载 Comparable与Comparator的区别 (转载) Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部 ...
 - Java中的TreeMap、Comparable、Comparator
		
我们知道HashMap的存储位置是按照key这个对象的hashCode来存放的,而TreeMap则是不是按照hashCode来存放,他是按照实现的Comparable接口的compareTo这个方法来 ...
 - 比较器comparable与comparator的使用
		
在Java学习和使用里,工具类与算法类(collections和Arrays)也是我们使用比较多的,在它们里面就包含了comparable与comparator这两种比较器. 一.比较器的分类与概念 ...
 - 简谈Comparable和Comparator区别
		
对于Comparable和Comparator这连个相似的接口,还是做一下比较比较好: Comparable Comparator (1)只包含一个compareTo()方法,此方法可以给两个对象排序 ...
 
随机推荐
- Barcode.js功能强大的条码生成jQuery插件
			
本文转载自http://www.uedsc.com/barcode-js.html Barcode.js是一个基于jQuery库的插件,用于绘制条形码或者二维码,能够生成基于DIV+CSS或者Canv ...
 - WP8.1学习系列(第六章)——中心控件Hub面板部分交互UX
			
本主题中呈现的模型类似于适用于 Windows Phone 的具有主页菜单(中心或透视控件)的中心应用中描述的模型.正如之前的案例所示,你要向用户呈现不同的功能区域.此处的区别在于你可以在顶层呈现所有 ...
 - springboot---->集成mybatis开发(二)
			
这里面我们介绍一下springboot集成mybatis完成一对多数据和一对一数据的功能.任何一个人离开你 都并非突然做的决定 人心是慢慢变冷 树叶是渐渐变黄 故事是缓缓写到结局 而爱是因为失望太多 ...
 - 【线程】Thread中的join介绍
			
因为sleep.wait.join等阻塞,可以使用interrupted exception异常唤醒. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行 ...
 - Linux命令 free:查看内存使用情况
 - 题目1100:最短路径(最短路径问题进阶dijkstra算法)
			
题目链接:http://ac.jobdu.com/problem.php?pid=1100 详细链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: ...
 - LeetCode 10 Regular Expression Matching(字符串匹配)
			
题目链接 https://leetcode.com/problems/regular-expression-matching/?tab=Description '.' Matches any si ...
 - Linux主机添加路由和端口转发
			
环境(关闭防火墙和seLinux): 6A: CentOS6 7A 和 7B:CentOS 7 6A: 192.168.20.131/24 7B: 192.168.20.129/24 和 192.16 ...
 - Java环境变量配置错误
			
1,由于Java的环境变量配置错误,导致用到Java的编译过程中出现错误: 改正办法: wget http://download.oracle.com/otn-pub/java/jdk/8u181-b ...
 - 关于spring中的事件体系
			
在客户这边上班,平时做开发的时候用到了一个客户自己写的一个开发框架,和spring类似,就是功能少一点,提供了依赖注入,事件体系,任务执行等常用的功能,还提供了一个桥接器,可以把spring中的bea ...