如何在java中实现比较器?

时间:2011-12-24 18:30:30

标签: java collections set

Stop(Id, Name)是一个java类,我希望将这些停止对象存储在java.util.Set中,并且这些对象应该根据Id的{​​{1}}进行排序。 这是我的比较器

Stop

但它没有给出正确的结果?

3 个答案:

答案 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你需要实现equalshashcode,以便该类在每个Set实现中表现一致,但对于TreeSet,这应该像TreeSet一样工作在执行compareToaddremove操作时(而不是像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不一致,则排序集(或有序映射)将表现得“奇怪”。特别是有序集(或有序映射)将违反集合(或映射)的一般契约,它以等于的方式定义。

我建议您尝试实施equalshashCode