加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用TreeSet进行排序而不向其提供Comparator

发布时间:2020-12-15 04:25:11 所属栏目:Java 来源:网络整理
导读:我知道 java中的TreeSet会按升序自动对其元素进行排序,以保证顺序. 例如,如果我有一个随机的Date对象数组,并将其复制到TreeSet,那么它将以有序的方式添加到TreeSet中. 但是假设我有一个HashMap的ArrayList String,Object而不是一个简单的Date对象,采用以下格
我知道 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进行排序?

解决方法

What is the point of using TreeSet in this situation for sorting data if i am also providing a custom Comparator to it ?

因为它是TreeSet代码,它保持排序.您没有必须提供任何代码 – 您必须提供的是自定义比较.

How can i sort this ArrayList of HashMap based on date value without using a new instance of Comparator in 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>并排序.

但鉴于您必须提供与比较器基本相同的代码并将您的比较与地图类型绑定,我觉得最好只是坚持使用比较器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读