Stop(Id, Name)
是一个java类,我希望将这些停止对象存储在java.util.Set
中,并且这些对象应该根据Id
的{{1}}进行排序。
这是我的比较器
Stop
但它没有给出正确的结果?
答案 0 :(得分:2)
Stop是否实现了与比较器在同一场上工作的equals方法?如果没有,那将导致问题。您也可能希望切换到让对象实现Comparable(虽然这不能解决您所看到的问题)。
实施equals()
方法后,您还应该实现适用于同一字段的hashCode()
方法。
Findbugs可能会告诉你这些事情。它非常有用。
答案 1 :(得分:1)
以下代码适用于我 -
public class Stop {
private Long id;
private String name;
public Stop(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Stop{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
private static class StopComparator implements Comparator<Stop> {
public int compare(Stop o1, Stop o2) {
return o1.getId().compareTo(o2.getId());
}
}
public static void main(String[] args) {
Set<Stop> set = new TreeSet<Stop>(new StopComparator());
set.add(new Stop(102L, "name102"));
set.add(new Stop(66L, "name66"));
set.add(new Stop(72L, "name72"));
System.out.println(set);
}
}
打印 -
[停止{id = 66,name ='name66'},停止{id = 72,name ='name72'},停止{id = 102, 名称= name102'}]
Ofc你需要实现equals
和hashcode
,以便该类在每个Set
实现中表现一致,但对于TreeSet
,这应该像TreeSet
一样工作在执行compareTo
,add
或remove
操作时(而不是像contains
这样的equals
)依赖HashSet
方法。
答案 2 :(得分:0)
这来自Comparator
文档:
当且仅当c.compare(e1,e2)== 0具有与e1.equals(e2)相同的布尔值时,比较器c对一组元素S施加的排序被认为与equals一致。对于S中的每个e1和e2。
当使用能够强加与equals不一致的排序的比较器来排序有序集(或有序映射)时,应该小心。假设带有显式比较器c的有序集(或有序映射)与从集合S中绘制的元素(或键)一起使用。如果由S对S施加的排序与equals不一致,则排序集(或有序映射)将表现得“奇怪”。特别是有序集(或有序映射)将违反集合(或映射)的一般契约,它以等于的方式定义。
我建议您尝试实施equals
和hashCode
。