2011-12-24 86 views
-1

Stop(Id, Name)是一个java类,我想将这些停止对象存储在java.util.Set中,并且这些对象应根据StopId排序。 这是我的比较器如何在java中实现比较器?

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()); 

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

+10

你的意思是“它没有给出正确的结果?”订单是否搞乱了?它是否会抛出异常?世界结束了吗?圣诞老人被兔子取代了吗?请提供完整的详细信息(输入数据,添加元素设置,结果/调用堆栈,兔子照片和预期圣诞老人草图。 – 2011-12-24 18:36:27

+0

它没有给出正确的顺序。如何做到这一点,我需要实现equals和hashcode方法? – 2011-12-24 18:46:35

回答

2

停止是否实现与您的比较器在同一字段上工作的equals方法?如果没有,那么这将导致问题。您也可能想切换到使对象实现Comparable(尽管这不会解决您所看到的问题)。

一旦你实现equals()方法,那么你也应该实现一个hashCode()方法在同一领域工作。

Findbugs可能会告诉你这些东西。它非常有用。

0

这是从Comparator文档:

由比较器C上的一组元件S的确定的顺序对被说成是与equals一致当且仅当c.compare(E1,E2)= = 0与s1中的每个e1和e2具有相同的布尔值。

当使用能够强制排序与equals不一致的比较器来排序排序集(或排序)时应谨慎地图)。假设使用显式比较器c的排序集合(或排序映射)与从集合S中绘制的元素(或键)一起使用。如果由S对c施加的排序与equals不一致,则排序集合(或排序映射)将表现“奇怪”。特别是,排序后的集合(或排序后的映射)将违反集合(或映射)的一般合约,这是以等价的方式定义的。

我建议尝试实施equalshashCode

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,名字= 'name66'},停止{ID = 72,名= 'name72'},{停止ID = 102, 名= 'name102'}]

OFC需要实现equalshashcode使类一贯的行为在每个Set实现,但对于TreeSet这应该是自TreeSet依赖于compareTo方法在执行addremovecontains操作(而不是像equalsHashSet)工作。

+0

TreeSet依赖compareTo方法执行put,remove或contains操作(而不是像HashSet等)。这究竟是什么。 – 2011-12-25 06:36:24

+0

设置接口契约说它应该使用'equals'来确定等号,但是'TreeSet'没有什么优化,并且使用'compareTo'来确定等号而不是'equlas',所以上面的例子应该不用'equlas'和'hashcode'来实现。在停课。 – Premraj 2011-12-25 06:50:16