Как отсортировать объекты в ArrayList по нескольким правилам - PullRequest
1 голос
/ 06 мая 2019


У меня есть Java ArrayList, содержащий некоторые объекты типа ObjType.

Допустим, у объекта есть два поля:
- A логическое поле isManual ()
- A double значение getAffinity ()

Я пытаюсь заказать этот ArrayList на основе более чем одного критерия:
Прежде всего, все объекты с isManual = true в том же порядке, в котором они уже есть в ArrayList
-Тогда мне нужны все объекты с isManual = false, упорядоченные getAffinityValue (от самого низкого до самого большого)

Я пришел с этим кодом, который не работает (кажется, что он сортируется случайным образом):

Collections.sort(coda, new Comparator<ObjType>() {

            public int compare(ObjType a, ObjType b) {
                boolean b1=a.isManual();
                boolean b2=b.isManual();
                if(b1 && b2) {
                    if (a.getAffinity() < b.getAffinity()) return 1;
                    if (a.getAffinity() > b.getAffinity()) return -1;
                    return 0;
                }
                if (b1) return -1;
                if (b2) return 1;
                if (a.getAffinity() < b.getAffinity()) return 1;
                if (a.getAffinity() > b.getAffinity()) return -1;
                return 0;
            }
}

Есть предложения? Большое спасибо!

1 Ответ

1 голос
/ 06 мая 2019

Сначала все объекты с isManual = true в том же порядке, в котором они уже есть в ArrayList

Тогда в случае, когда оба объекта имеют isManual == true, вы не должны возвращать ничего, кроме 0.

Тогда я хочу, чтобы все объекты с isManual = false были упорядочены getAffinityValue (от самого низкого до самого большого)

Тогда эти строки:

if (a.getAffinity() < b.getAffinity()) return 1;
if (a.getAffinity() > b.getAffinity()) return -1; 

должен возвращать противоположные значения, которые они возвращают.
Попробуй так:

Collections.sort(coda, new Comparator<ObjType>() {
    public int compare(ObjType a, ObjType b) {
        boolean b1=a.isManual();
        boolean b2=b.isManual();

        if(b1 && b2) return 0;
        if (b1) return -1;
        if (b2) return 1;

        Double affinity1 = a.getAffinity();
        Double affinity2 = b.getAffinity();
        return affinity1.compareTo(affinity2);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...