我试图创建一个具有以下格式的TreeMap:
TreeMap<Kenel, List<Dog>> treeMapOfKennelsAndDogs;每个条目都是一个带有附加的Kennel列表的Dogs对象。我想比较每只最老的狗的每只犬,并相应地订购。
然而,treeMap的顺序不是我所期望的,似乎当一个犬类在列表中有一个大小为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中的不正确排序?
发布于 2016-08-22 10:28:38
服务类中的比较器逻辑:
TreeSet不知道您的服务类。它只知道内部的通用类型。
第一溶液:
比较器逻辑应该位于将在TreeSet中排序的类中。您应该在Comparator类中实现compare方法和ovverade方法。
第二溶液:
在创建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()?
发布于 2016-08-22 10:41:42
Map<K, V>键的逻辑不应依赖于V类。Map后修改键实例?如果是的话-这是个问题。等式检查只在插入上*。https://stackoverflow.com/questions/39076836
复制相似问题