[英]in Java how to implement multiple comparator methods for a class that extends Comparator?
[英]how to implement comparator in java?
Stop(Id, Name)
是一个Java类,我想将这些stop对象存储在java.util.Set
并且这些对象应该根据Stop
的Id
进行排序。 这是我的比较者
public class StopsComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
// TODO Auto-generated method stub
Stop stop1 = (Stop)o1;
Stop stop2 = (Stop)o2;
return stop1.getStopId().compareTo(stop2.getStopId());
}
}
private Set<Stop> stops = new TreeSet<Stop>(new StopsComparator());
但是它没有给出正确的结果?
Stop是否实现与比较器在同一字段上工作的equals方法? 如果没有,那将导致问题。 您可能还希望切换以使您的对象实现Comparable(尽管这不能解决您遇到的问题)。
一旦实现equals()
方法,则还应该实现在相同字段上工作的hashCode()
方法。
Findbugs可能会告诉您这些事情。 它非常有用。
以下代码对我有用-
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);
}
}
版画-
[Stop {id = 66,name ='name66'},Stop {id = 72,name ='name72'},Stop {id = 102,name ='name102'}]]
Ofc您需要实现equals
和hashcode
以便类在每个Set
实现中始终保持一致的行为,但是对于TreeSet
它应该按原样工作,因为TreeSet
在执行add
, remove
或contains
操作(而不是像HashSet
这样的equals
)时依赖compareTo
方法。
这来自Comparator
文档:
当且仅当c.compare(e1,e2)== 0的布尔值与e1.equals(e2)的布尔值相等时,比较器c才对元素S的集合排序等于equals。和S中的e2。
当使用能够施加与等于排序集合(或排序映射)的等于不一致的排序的比较器时,应谨慎行事。 假设带有显式比较器c的排序集(或排序图)与从集合S提取的元素(或键)一起使用。如果c对S施加的排序与等式不一致,则排序集(或排序图)将表现“奇怪”。 特别是,排序后的集合(或排序后的映射)将违反集合(或映射)的一般契约,后者是用等值定义的。
我建议尝试实现equals
和hashCode
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.