首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TreeMap比较器没有给出预期的订单?

TreeMap比较器没有给出预期的订单?
EN

Stack Overflow用户
提问于 2016-08-22 10:13:06
回答 2查看 91关注 0票数 1

我试图创建一个具有以下格式的TreeMap

代码语言:javascript
复制
TreeMap<Kenel, List<Dog>> treeMapOfKennelsAndDogs;

每个条目都是一个带有附加的Kennel列表的Dogs对象。我想比较每只最老的狗的每只犬,并相应地订购。

然而,treeMap的顺序不是我所期望的,似乎当一个犬类在列表中有一个大小为1的狗列表时,排序是不正确的。

下面是我的代码,查找与每个犬类相关的最古老的狗,以及我的比较器逻辑。

代码语言:javascript
复制
@Entity
@Table(name = "KENNEL")
public class Kennel {

    //other fields 

    @OneToMany(cascade = CascadeType.MERGE, orphanRemoval = true)
    @JoinColumn(name = "KENNEL_ID", referencedColumnName = "ID", updatable = true, insertable = true)
    private List<Dog> dogList;

     public DateTime getOldestDogInList() {
        if (dogList.size() == 0) {
            return null; }

        Dog dog= dogList.get(0);
        for (int i = 1; i < dogList.size(); i++) {
            dog d = dogList.get(i);
            if (d.getCreated().isBefore(dog.getCreated())) {
                dog = d;
            }
        }
        return dog.getCreated();
    }

服务类中的比较器逻辑:

代码语言:javascript
复制
    Comparator<Kennel> oldestDog = new Comparator<Kennel>() {
        @Override
        public int compare(Kennel k1, Kennel k2) {

            int result = k1.getOldestDogInList().compareTo(k2.getOldestDogInList());

            return result;
        }
    };

  TreeMap<Kennel, List<Dog>> treeMapOfKennelsAndDogs = new TreeMap<>(oldestDog);    

代码中是否有错误会导致TreeMap中的不正确排序?

EN

回答 2

Stack Overflow用户

发布于 2016-08-22 10:28:38

服务类中的比较器逻辑:

TreeSet不知道您的服务类。它只知道内部的通用类型。

第一溶液:

比较器逻辑应该位于将在TreeSet中排序的类中。您应该在Comparator类中实现compare方法和ovverade方法。

第二溶液:

在创建Comparator时设置TreeMap

代码语言:javascript
复制
TreeMap<Kenel, List<Dog>> treemap = new TreeMap<Kenel, List<Dog>>(new Comparator<Kenel>() {
    public int compare(Kennel k1, Kennel k2) {
        int result = k1.getOldestDogInList().compareTo(k2.getOldestDogInList());
        return result;
    }
});

相关问题:What is the difference between compare() and compareTo()?

票数 0
EN

Stack Overflow用户

发布于 2016-08-22 10:41:42

  1. 比较Map<K, V>键的逻辑不应依赖于V类。
  2. 您是否在插入Map后修改键实例?如果是的话-这是个问题。等式检查只在插入上*。
  3. 树映射所保持的排序,与任何排序映射一样,以及是否提供显式比较器,都必须与相等一致。(来自javadoc)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39076836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档