比较器

记一次bug fix:比较器错误

雨燕双飞 提交于 2019-12-06 00:29:08
起 4月1号收到兼职端的反馈,说进入“已分配“页面失败,显示系统错误。使用我自己账号登录,无法复现问题,但是使用兼职同学提供的账号进行测试,确实存在这个问题。 定位问题 首先查看日志,有这样一段异常信息: java.lang.IllegalArgumentException: Comparison method violates its general contract! at java.util.TimSort.mergeLo(TimSort.java:773) ~[na:1.8.0_51] at java.util.TimSort.mergeAt(TimSort.java:510) ~[na:1.8.0_51] at java.util.TimSort.mergeForceCollapse(TimSort.java:453) ~[na:1.8.0_51] at java.util.TimSort.sort(TimSort.java:250) ~[na:1.8.0_51] at java.util.Arrays.sort(Arrays.java:1512) ~[na:1.8.0_51] at java.util.ArrayList.sort(ArrayList.java:1454) ~[na:1.8.0_51] at java.util.Collections.sort

算法 - 比较器 - Comparator

半世苍凉 提交于 2019-12-05 03:01:10
比较器 当排序不是程序的主要内容时,使用自定义比较器能够较快的实现排序目的。需要实现 Comparator 接口。 /** * 比较器 */ public class ComparatorTest01 { public static void main(String[] args) { Integer[] arr = {4, 5, 3, 2, 4, 5, 6, 72, 4, 7, 2, 4}; Arrays.sort(arr, new MyComparator()); System.out.println(Arrays.toString(arr)); } } class MyComparator implements Comparator<Integer> { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; } } 在构建 PriorityQueue 、 TreeMap 、 TreeSet 时可以传入一个比较器,这时候加入自定义数据类型就会根据制定的比较器规则进行排序。 举个例子:设计一个比较的类 Person,将会对 Person 类的属性 id 进行比较。 class Person { private int id; private String name; public Person

Java容器源码分析-HashSet vs TreeSet vs LinkedHashSet

空扰寡人 提交于 2019-12-04 16:56:54
这几天看了下容器的源码,总结一下HashSet vs TreeSet vs LinkedHashSet的区别, 如下图,collection的继承实现分支,这里先只讲解set分支 1、HashSet vs TreeSet vs LinkedHashSet三者的数据结构分析 (1)HashSet:由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。对于HashSet中保存的对象,请注意正确重写其equals和hashCode方法,以保证放入的对象的唯一性。 注意:hashSet是利用HashMap的key进行数据存储。同时HashMap的key具有唯一性 参考:http://www.cnblogs.com/ITtangtang/p/3948538.html (2) TreeSet:TreeSet实际上是TreeMap实现的。当我们构造TreeSet时;若使用不带参数的构造函数,则TreeSet的使用自然比较器;若用户需要使用自定义的比较器,则需要使用带比较器的参数。 参考:http://www.cnblogs.com/skywang12345/p/3311268.html (3) LinkedHashSet: LinkedHashSet也是一个集合,与HashSet不同的是

Java-比较器

核能气质少年 提交于 2019-12-04 06:28:02
对集合中的对象进行排序 1.Comparator 外部比较器,需要外部创建比较器对象实现 Comparator 接口 /** * 外部比较器 * 按age由小到大排序 */ class UserComparators implements Comparator<User>{ @Override public int compare(User o1, User o2) { if(o1.age > o2.age) { return 1; }else if(o1.age < o2.age) { return -1; } return 0; } } public class User{ int age; String name; public User(int age, String name) { super(); this.age = age; this.name = name; } public static void main(String[] args) { List<User> list = new ArrayList<>(); for (int i = 0; i < 12; i++) { list.add(new User(new Random().nextInt(210), i+"name")); } System.out.println(list);

Java中的比较器Comparable、Comparator

核能气质少年 提交于 2019-12-03 11:37:19
参考博客: java学习笔记13--比较器(Comparable、Comparator) 在Java代码中,我们常常会面临需要对集合进行排序的情况,这种情况下我们需要手动的定义Java比较器,告诉程序两个对象如何比较大小。 Java中的比较器分为两种Comparable和Comparator: Comparable:实现Comparable接口,并且重写compareTo(T o)方法 Comparator:实现Comparator接口,并且重写compare()和equals()方法 Comparable实现 class Student implements Comparable<Student>{ private String name; private int age; private float score; public Student(String name,int age,float score){ this.name = name; this.age = age; this.score = score; } @Override public int compareTo(Student stu) { //覆写compareTo方法实现排序规则的应用 if(this.score>stu.score){ return -1; }else if(this.score<stu

如何决定使用 HashMap 还是 TreeMap? (转)

烂漫一生 提交于 2019-12-03 10:27:26
问: 如何决定使用 HashMap 还是 TreeMap? 介绍   TreeMap<K,V> 的Key值是要求实现 java.lang.Comparable ,所以迭代的时候TreeMap默认是按照Key值升序排序的;TreeMap的实现是基于红黑树结构。适用于按自然顺序或自定义顺序遍历键(key)。   HashMap<K,V> 的Key值实现散列 hashCode() ,分布是散列的、均匀的,不支持排序;数据结构主要是桶(数组),链表或红黑树。适用于在Map中插入、删除和定位元素。 结论   如果你需要得到一个有序的结果时就应该使用TreeMap(因为HashMap中元素的排列顺序是不固定的)。除此之外,由于HashMap有更好的性能,所以大多不需要排序的时候我们会使用HashMap。 拓展 1、HashMap 和 TreeMap 的实现 HashMap: 基于哈希表实现。使用HashMap要求添加的键类明确定义了 hashCode() 和 equals() [可以重写 hashCode() 和 equals() ],为了优化HashMap空间的使用,您可以调优初始容量和负载因子。 HashMap(): 构建一个空的哈希映像 HashMap(Map m): 构建一个哈希映像,并且添加映像m的所有映射 HashMap(int initialCapacity):

Java集合框架之Map实例解析

為{幸葍}努か 提交于 2019-12-03 09:35:56
1、Map概述 1.1 什么是Map Map是将 键映射到值( key-value ) 的对象。一个映射 不能包含重复的键 ;每个键最多只能映射到一个值。Map 接口提供三种collection 视图,允许以 键集 (keySet())、 值集 (values())或 键-值映射关系集 (entrySet())的形式查看某个映射的内容( 即获取键值对的内容 )。 映射顺序定义为迭代器在映射的 collection 视图上返回其元素的顺序,即 可以映射得到键、值和键-值的Set集合 ,元素的顺序是由得到的Set集合所决定的。某些映射实现可明确保证其顺序,如 TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类 。 1.2 Map与Collection的区别 1.Map 存储的是键值对形式的元素,键唯一,值可以重复。 2.Collection 存储的是单列元素,子接口Set元素唯一,子接口List元素可重复。 3.Map集合的数据结构值针对键有效,跟值无关,Collection集合的数据结构是针对元素有效 关于Collection可以戳这里 java集合框架之Collection实例解析 2、Map继承体系 下面列出了常见Map集合的继承体系与他们的特点 ---Map 键唯一 |------HashMap 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作

TreeMap源码分析

喜你入骨 提交于 2019-12-03 07:39:45
一、前言   当我们需要把插入的元素进行排序的时候,就是时候考虑TreeMap了,从名字上来看,TreeMap肯定是和树是脱不了干系的,它是一个排序了的Map,下面我们来着重分析其源码,理解其底层如何实现排序功能。下面,开始分析。 二、TreeMap示例 import java.util.TreeMap; import java.util.Map; public class TreeMapTest { public static void main(String[] args) { Map<String, String> maps = new TreeMap<String, String>(); maps.put("aa", "aa"); maps.put("cc", "cc"); maps.put("bb", "bb"); for (Map.Entry<String, String> entry : maps.entrySet()) { System.out.println(entry.getKey() + " : " + entry.getValue()); } } }   运行结果:   aa : aa   bb : bb   cc : cc   说明:从输出结果可以看到TreeMap对插入的元素进行了排序。 三、TreeMap数据结构