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()方法,此方法可以给两个对象排序 ...
随机推荐
- RabbitMQ笔记四:Binding,Queue,Message概念
Binding详解 黄线部分就是binding Exchange与Exchange,Queue之间的虚拟连接,Binding中可以包含Routing key或者参数 创建binding 注意: ...
- .net环境下的缓存技术-转载!
摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1 概念 1.1 缓存能解决的问题 · 性 ...
- Linux下安装PHP 5.4.3(以Apache为WebServer)
转载http://www.cnblogs.com/rainisic/archive/2012/05/23/Apache_PHP_Install.html 下载PHP 官方下载:http://www.p ...
- css方法 - 移动端reset汇总与注释
1.解决移动端触摸a元素,会有蓝色阴影 正常状态: 点击时状态: a{ outline:none; -webkit-tap-highlight-color: rgba(,,,); } -webkit- ...
- 2015.7.11js-10(无缝滚动)
1.实现原理:setInterval定时器,让某元素position的left属性定时滚动,使用到js中的元素的offsetLeft属性. 2.案例:1.css的实现是外div是4张图片的总宽度,设置 ...
- jumpserver的安装
原文地址:http://docs.jumpserver.org/zh/docs/step_by_step.html 为了保证服务器安全,加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有身份 ...
- Adobe edge animate制作HTML5动画可视化工具(一)
Edge Animate for mac是Adobe最新出品的制作HTML5动画的可视化工具,简单的可以理解为HTML5版本的Flash Pro.在之后的文章中,我会逐一的介绍这款新的HTML5动画神 ...
- libxml2简单的生成、解析操作
3. 简单xml操作例子 link:http://www.blogjava.net/wxb_nudt/archive/2007/11/18/161340.html 了解以上基本知识之后,就可以进行一些 ...
- java 内存深度解析
java 中的包括以下几大种的内存区域:1.寄存器 2.stack(栈) 3.heap(堆) 4.数据段 5.常量池 那么相应的内存区域中又存放什么东西(主要介绍 stack heap)? 栈: ...
- 2.2RNN
RNN RNN无法回忆起长久的记忆 LSTM (long short Term memory长短期记忆)解决梯度消失或弥散vanishing 和梯度爆炸explosion 0.9*n-->0 ...