Как реализовать компаратор в Java? - PullRequest
0 голосов
/ 24 декабря 2011

Stop(Id, Name) - это класс Java, и я хочу сохранить эти объекты остановки в java.util.Set, и эти объекты должны быть отсортированы в соответствии с Id из Stop. это мой компаратор

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

но это не дает правильный результат?

Ответы [ 3 ]

2 голосов
/ 24 декабря 2011

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

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

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

1 голос
/ 24 декабря 2011

У меня работает следующий код -

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, имя = 'name102'}]

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

0 голосов
/ 24 декабря 2011

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

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

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

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

...