TreeMap Comparator没有给出预期的订单?

时间:2016-08-22 10:13:06

标签: java list entity comparator treemap

我正在尝试使用以下格式创建TreeMap

TreeMap<Kenel, List<Dog>> treeMapOfKennelsAndDogs;

每个条目都是Kennel对象,其中附加了Dogs列表。我想通过每个中最老的狗来比较每个犬舍并相应地进行排序。

然而treeMap的顺序并不是我所期望的,似乎当一个狗窝在列表中有一个 size 1 的狗列表时,排序是不正确的。

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

@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();
    }

服务类中的比较器逻辑:

    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中排序错误的错误?

2 个答案:

答案 0 :(得分:0)

  

服务类中的比较器逻辑:

TreeSet 不了解您的服务类。它只知道里面的Generic类型。

第一次溶解:

比较器逻辑应该在一个将在TreeSet中排序的类中。您应该在Comparator课程中实施compare和ovverade Kennel方法。

第二次溶解:

创建Comparator时设置TreeMap

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()?

答案 1 :(得分:0)

  1. 比较Map<K, V>键的逻辑不应该依赖V类。
  2. 插入Map后是否修改了密钥实例?如果是 - 这是一个问题。平等检查仅限于使用*。
  3. 由树图维护的排序,与任何有序映射一样,以及是否提供显式比较器,必须与equals一致。 (来自javadoc)