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

  1. package comparableAndComparator;
  2.  
  3. import java.util.Collections;
  4. import java.util.LinkedList;
  5.  
  6. /**
  7. * @program: GradleTestUseSubModule
  8. * @author: Yafei Li
  9. * @create: 2018-09-10 16:18
  10. **/
  11. public class Main {
  12. public static void main(String[] args){
  13. LinkedList<Person> linkedList = new LinkedList<>();
  14. linkedList.add(new Person("wangwu"));
  15. linkedList.add(new Person("lisi"));
  16. linkedList.add(new Person("zhangsan"));
  17. linkedList.stream().forEach(person -> {
  18. System.out.println(person.name);
  19. });
  20. Collections.sort(linkedList);
  21. System.out.println("--------------------------");
  22. linkedList.stream().forEach(person -> {
  23. System.out.println(person.name);
  24. });
  25. }
  26. }
  27.  
  28. class Person implements Comparable<Person>{
  29.  
  30. public String name;
  31.  
  32. public Person(String name) {
  33. this.name = name;
  34. }
  35.  
  36. public int compareTo(Person person) {
  37. return person.name.compareTo(name);
  38. }
  39. }

结果:

  1. wangwu
  2. lisi
  3. zhangsan
  4. --------------------------
  5. zhangsan
  6. wangwu
  7. lisi

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

  1. package comparableAndComparator;
  2.  
  3. import java.util.Collections;
  4. import java.util.Comparator;
  5. import java.util.LinkedList;
  6.  
  7. /**
  8. * @program: GradleTestUseSubModule
  9. * @author: Yafei Li
  10. * @create: 2018-09-10 16:18
  11. **/
  12. public class Main {
  13. public static void main(String[] args){
  14. LinkedList<Person> linkedList = new LinkedList<>();
  15. linkedList.add(new Person("wangwu"));
  16. linkedList.add(new Person("lisi"));
  17. linkedList.add(new Person("zhangsan"));
  18. linkedList.stream().forEach(person -> {
  19. System.out.println(person.name);
  20. });
  21. Collections.sort(linkedList,new PersonComparator());
  22. System.out.println("--------------------------");
  23. linkedList.stream().forEach(person -> {
  24. System.out.println(person.name);
  25. });
  26. }
  27. }
  28.  
  29. class Person{
  30.  
  31. public String name;
  32.  
  33. public Person(String name) {
  34. this.name = name;
  35. }
  36. }
  37.  
  38. class PersonComparator implements Comparator<Person>{
  39. public int compare(Person p1, Person p2) {
  40. return p1.name.compareTo(p2.name);
  41. }
  42. }

结果:

  1. wangwu
  2. lisi
  3. zhangsan
  4. --------------------------
  5. lisi
  6. wangwu
  7. zhangsan

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

  1. package com.li.jingdong;
  2.  
  3. import java.util.Comparator;
  4. import java.util.LinkedHashMap;
  5. import java.util.Map;
  6. import java.util.stream.Stream;
  7.  
  8. /**
  9. * @program: GradleTestUseSubModule
  10. * @author: Yafei Li
  11. * @create: 2018-09-10 10:37
  12. **/
  13. public class Main5 {
  14.  
  15. public static void salaryfrequeny(int num,int[] salaries) throws NoSuchFieldException, IllegalAccessException {
  16. Map<Integer, Integer> map = new LinkedHashMap<>();
  17. for (int i = 0; i < num; i++) {
  18. map.computeIfPresent(salaries[i],(k,v)->{
  19. return v+1;
  20. });
  21. map.putIfAbsent(salaries[i], 1);
  22. }
  23. Map<Integer, Integer> sortMap = sortByKey(map);
  24. System.out.println(sortMap);
  25. }
  26.  
  27. //根据值对map进行排序
  28. public static <K, V extends Comparable<? super V>> Map<K, V> sortByValue(Map<K, V> map) {
  29. Map<K, V> result = new LinkedHashMap<>();
  30. Stream<Map.Entry<K, V>> st = map.entrySet().stream();
  31. st.sorted(Comparator.comparing(e -> e.getValue())).forEach(e -> result.put(e.getKey(), e.getValue()));
  32. return result;
  33. }
  34. //根据键对map排序
  35. public static <K extends Comparable,V> Map<K,V> sortByKey(Map<K,V> map) {
  36. Map<K, V> resultMap = new LinkedHashMap<>();
  37. Stream<Map.Entry<K, V>> stream = map.entrySet().stream();
  38. //(a,b)->b.getKey().compareTo(a.getKey()) 是一个比较器
  39. stream.sorted((a,b)->b.getKey().compareTo(a.getKey())).forEach(e->{ //e就是挨个取出map中的Entry,
  40. System.out.println("key:"+e.getKey()+" value:"+e.getValue());
  41. resultMap.put(e.getKey(), e.getValue());
  42. });
  43. return resultMap;
  44. }
  45.  
  46. public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
  47.  
  48. int n=5;
  49. int[] salary = {1000, 2000, 1000, 3000, 2000};
  50. salaryfrequeny(n,salary);
  51. }
  52. }

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

  1. Map<Integer, Integer> map = new LinkedHashMap<>();
  2. Field tail = map.getClass().getDeclaredField("tail");
  3. tail.setAccessible(true);
  4. Map.Entry<Integer,Integer> entry=(Map.Entry<Integer, Integer>) tail.get(map);
  5. Integer key = entry.getKey();
  6. 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. RabbitMQ笔记四:Binding,Queue,Message概念

    Binding详解   黄线部分就是binding Exchange与Exchange,Queue之间的虚拟连接,Binding中可以包含Routing key或者参数   创建binding 注意: ...

  2. .net环境下的缓存技术-转载!

    摘要: 介绍缓存的基本概念和常用的缓存技术,给出了各种技术的实现机制的简单介绍和适用范围说明,以及设计缓存方案应该考虑的问题(共17页) 1         概念 1.1   缓存能解决的问题 · 性 ...

  3. Linux下安装PHP 5.4.3(以Apache为WebServer)

    转载http://www.cnblogs.com/rainisic/archive/2012/05/23/Apache_PHP_Install.html 下载PHP 官方下载:http://www.p ...

  4. css方法 - 移动端reset汇总与注释

    1.解决移动端触摸a元素,会有蓝色阴影 正常状态: 点击时状态: a{ outline:none; -webkit-tap-highlight-color: rgba(,,,); } -webkit- ...

  5. 2015.7.11js-10(无缝滚动)

    1.实现原理:setInterval定时器,让某元素position的left属性定时滚动,使用到js中的元素的offsetLeft属性. 2.案例:1.css的实现是外div是4张图片的总宽度,设置 ...

  6. jumpserver的安装

    原文地址:http://docs.jumpserver.org/zh/docs/step_by_step.html 为了保证服务器安全,加个堡垒机,所有ssh连接都通过堡垒机来完成,堡垒机也需要有身份 ...

  7. Adobe edge animate制作HTML5动画可视化工具(一)

    Edge Animate for mac是Adobe最新出品的制作HTML5动画的可视化工具,简单的可以理解为HTML5版本的Flash Pro.在之后的文章中,我会逐一的介绍这款新的HTML5动画神 ...

  8. libxml2简单的生成、解析操作

    3. 简单xml操作例子 link:http://www.blogjava.net/wxb_nudt/archive/2007/11/18/161340.html 了解以上基本知识之后,就可以进行一些 ...

  9. java 内存深度解析

    java 中的包括以下几大种的内存区域:1.寄存器    2.stack(栈) 3.heap(堆) 4.数据段 5.常量池 那么相应的内存区域中又存放什么东西(主要介绍 stack heap)? 栈: ...

  10. 2.2RNN

    RNN RNN无法回忆起长久的记忆 LSTM (long short Term memory长短期记忆)解决梯度消失或弥散vanishing 和梯度爆炸explosion  0.9*n-->0 ...