java – 使用TreeSet进行排序而不向其提供Comparator
我知道
java中的TreeSet会按升序自动对其元素进行排序,以保证顺序.
例如,如果我有一个随机的Date对象数组,并将其复制到TreeSet,那么它将以有序的方式添加到TreeSet中. 但是假设我有一个HashMap的ArrayList< String,Object>而不是一个简单的Date对象,采用以下格式. arraylist的第一个价值, {mydate = 32156464,mystring = "abc",mystring2 = "xyz"} hashmap的arraylist中的第二个值, {mydate = 64687678,mystring = "abdc",mystring2 = "xyzzz"} hashmap的arraylist中的第3个值, {mydate = 11233678,mystring = "abxdc",mystring2 = "xyzppzz"} 现在,如果我想基于mydate键对这个hashmap的arraylist进行排序,我必须在TreeSet实例中创建一个新的比较器,如下所示, public static Set<HashMap<String,Object>> mySet = new TreeSet<>(new Comparator<HashMap<String,Object>>() { @Override public int compare(HashMap<String,Object> o1,HashMap<String,Object> o2) { return ((Date) o2.get(mydate)).compareTo((mydate) o1.get(DATE)); } }); 并且它会按照排序顺序将arraylist存储在TreeSet中.但我使用自定义Comparator来实现这一目标.如果我还在为它提供自定义Comparator,那么在这种情况下使用TreeSet对数据进行排序有什么意义呢? 如何在不使用TreeSet中的Comparator新实例的情况下,根据日期值对HashMap的ArrayList进行排序? 解决方法
因为它是TreeSet代码,它保持排序.您没有必须提供任何代码 – 您必须提供的是自定义比较.
你不能,直接.你可以写一个HashMap的子类,它为自己实现了Comparable,但这对我来说似乎有些奇怪.例如: public class SpecialMap extends HashMap<String,Object> implements Comparable<SpecialMap> { private final String key; public SpecialMap(String key) { this.key = key; } public int compareTo(SpecialMap other) { // TODO: Null handling Date thisDate = (Date) this.get(key); Date otherDate = (Date) other.get(key); return thisDate.compareTo(otherDate); } } 然后你可以有一个ArrayList< SpecialMap>并排序. 但鉴于您必须提供与比较器基本相同的代码并将您的比较与地图类型绑定,我觉得最好只是坚持使用比较器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 必须在GetStringUTFChars之后调用ReleaseStringUTF
- 【Android工具类】比DES加密更安全的算法——3DES加密算法
- java中的随机标识符
- JAAS authentication in Tomcat example--reference
- java中volatile不能保证线程安全(实例讲解)
- java实现Socket编程实例代码
- java – 如何使用bean中的属性格式化字符串
- ssm复习资料
- java-ColdFusion 2018中的iText pdfReader不发布文件
- 未设置getAttribute(“javax.servlet.request.X509Certific