Хранение SortedSet объектов на основе свойства - PullRequest
0 голосов
/ 21 марта 2012

У меня есть объект, Test, который имеет два свойства, double x и double y.Я хочу добавить эти объекты в SortedSet, сохраняя сортировку набора в порядке ASC по x 1005 *.Если два экземпляра Test имеют одинаковые значения x, я хочу, чтобы они были отсортированы в пределах набора по их значениям y.

Я думал, что следующее поможет:

private SortedSet<Test> tests = new TreeSet<Test>(new Comparator<Test>() {

@Override
public int compare(Test o1, Test o2) {
    if (o1.getXpos() < o2.getXpos()) {
        return -1;
    }
    if (o1.getXpos() > o2.getXpos()) {
        return 1;
    }
    if (o1.getXpos() == o2.getXpos()) {
        if (o1.getYpos() < o2.getYpos()) {
            return -1;
        }
        if (o1.getYpos() > o2.getYpos()) {
            return 1;
        }
        if (o1.getYpos() == o2.getYpos()) {
            return 0;
        }
    }
    return 0;
}
});

Вместо этого это заказывает фактические значения x и y;т.е.

testA: x = 200, y = 200,

testB: x = 200, y = 400

После вставки в tests:

testA: x = 200, y = 200,

testB: x = 400, y = 200

Вместо экземпляров в tests.

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Ваш компаратор правильный.Однако у вас возникают большие проблемы, если добавление объектов Test в набор приводит к изменению их переменных-членов, например «testB: x = 400, y = 200» -> «testB: x = 200, y = 400».Я полагаю, что ваша проблема заключается в коде, который вы не включили (возможно, в испорченном конструкторе?).

0 голосов
/ 21 марта 2012

Я предполагаю, что сравнение double s для точного равенства с использованием == потенциально является проблемой.См. Что не так с использованием == для сравнения чисел с плавающей точкой в ​​Java?

0 голосов
/ 21 марта 2012

Вы пробовали использовать более двух элементов?Я не раз просто сортировал вещи назад, не осознавая этого до позднего времени.

...