2011-12-24 6 views
-1

Stop(Id, Name) - класс java, и я хочу хранить эти объекты остановки в java.util.Set, и эти объекты должны сортироваться в соответствии с IdStop. это мой компараторКак реализовать компаратор в 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

Что вы подразумеваете под словом 'его не дающий правильный результат?' Оправдывается ли заказ? Бросает ли это исключения? Закончился ли мир? Был ли Санта заменен кроликом? Пожалуйста, предоставьте полную информацию (входные данные, вызовы добавьте элементы для установки, стек результата/вызова, фото зайчика и эскиз ожидаемого santa. –

+0

его не дает правильный порядок. Как это сделать, мне нужно реализовать методы equals и hashcode? –

ответ

2

Does Stop реализует метод equals, который работает в том же поле, что и ваш компаратор? Если нет, это приведет к проблемам. Вы также можете переключиться на то, чтобы ваш объект реализовал Comparable (хотя это не устранит проблему, которую вы видите).

После того как вы внедрили метод equals(), вы также должны реализовать метод hashCode(), который работает в одном и том же поле.

Findbugs, вероятно, сказал бы вам об этом. Это чрезвычайно полезно.

0

Это из Comparator документов:

Упорядочение налагается компаратор с на множестве элементов S, как говорит, чтобы быть совместимыми с равными тогда и только тогда, когда c.compare (е1, е2) = = 0 имеет то же булево значение, что и e1.equals (e2) для каждого e1 и e2 в S.

Следует соблюдать осторожность при использовании компаратора, способного навязывать упорядочение, не соответствующее порядку сортированного набора (или отсортированного карта). Предположим, что отсортированный набор (или отсортированная карта) с явным компаратором c используется с элементами (или ключами), взятыми из набора S. Если порядок, наложенный c на S, несовместим с равными, отсортированный набор (или отсортированная карта) будет ведут себя «странно». В частности, сортированный набор (или отсортированная карта) нарушит общий контракт для множества (или карты), который определяется в терминах равных.

Я бы рекомендовал попробовать equals и hashCode.

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'}, Stop {ID = 72, имя = 'name72'}, {Stop ID = 102, имя = 'name102'}]

Ofc вам нужно реализовать equals и hashcode так, что класс ведет себя последовательно в каждом Set реализации, но для TreeSet это должно работать как есть, так как TreeSet полагается на compareTo методе при выполнении add, remove или contains операций (вместо equals как HashSet).

+0

TreeSet полагается на метод compareTo при выполнении put, remove или содержит операции (вместо equals like HashSet). что именно это. –

+0

Установить контракт на интерфейс говорит, что он должен использовать 'equals' для определения равенства, но' TreeSet' мало оптимизирует и использует 'compareTo' для определения равенства, а не' equlas', поэтому вышеприведенный пример должен работать без реализации 'equlas' и' hashcode' в классе Stop. – Premraj

Смежные вопросы