我正在尝试使用以下格式创建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中排序错误的错误?
答案 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)
Map<K, V>
键的逻辑不应该依赖V
类。Map
后是否修改了密钥实例?如果是 - 这是一个问题。平等检查仅限于使用*。