繁体   English   中英

如何在Java中实现比较器?

[英]how to implement comparator in java?

Stop(Id, Name)是一个Java类,我想将这些stop对象存储在java.util.Set并且这些对象应该根据StopId进行排序。 这是我的比较者

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您需要实现equalshashcode以便类在每个Set实现中始终保持一致的行为,但是对于TreeSet它应该按原样工作,因为TreeSet在执行addremovecontains操作(而不是像HashSet这样的equals )时依赖compareTo方法。

这来自Comparator文档:

当且仅当c.compare(e1,e2)== 0的布尔值与e1.equals(e2)的布尔值相等时,比较器c才对元素S的集合排序等于equals。和S中的e2。

当使用能够施加与等于排序集合(或排序映射)的等于不一致的排序的比较器时,应谨慎行事。 假设带有显式比较器c的排序集(或排序图)与从集合S提取的元素(或键)一起使用。如果c对S施加的排序与等式不一致,则排序集(或排序图)将表现“奇怪”。 特别是,排序后的集合(或排序后的映射)将违反集合(或映射)的一般契约,后者是用等值定义的。

我建议尝试实现equalshashCode

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM