Java: Collections.sort не работает свойство? - PullRequest
0 голосов
/ 24 мая 2018

Итак, у меня есть список announceList, в котором есть список Announces, я пытаюсь отсортировать список по возрастанию по процентному значению, поэтому, если я получил список таким образом:

Announce1 - 20.10%
Announce2 - 20.54%
Announce3 - 27.50%
Announce4 - 76.36%

После сортировки я хочу получить такой список:

Announce4 - 76.36%
Announce3 - 27.50%
Announce2 - 20.54%
Announce1 - 20.10%

Я использую следующий метод:

Collections.sort(announceList, new Comparator<Announce>() {
   @Override
   public int compare(Announce o1, Announce o2) {
       int i1 = o1.getMatchPercentage().intValue();
       int i2 = o2.getMatchPercentage().intValue();
       return Integer.compare(i1, i2);
   }
});

adapter.setAnnounceList(announceList);
adapter.notifyDataSetChanged();

Но я не получаюперечислите, как я хотел, пожалуйста, если вы знаете, что я делаю неправильно, скажите, любая помощь будет оценена, спасибо.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

Вам необходимо сравнить фактические значения double/float, если вы хотите, чтобы десятичные разряды влияли на вашу сортировку, т.е. избегайте 74,5> 74,9.Кроме того, поскольку вы хотите, чтобы сортировка происходила по убыванию, вы можете попробовать использовать Double.compare():

Collections.sort(announceList, new Comparator<Announce>() {
   @Override
   public int compare(Announce o1, Announce o2) {
       return Double.compare(o2.getMatchPercentage(), o1.getMatchPercentage());
   }
});

Если вы используете Java 8 или выше, вы также можете сделать:

announceList.sort(Comparator.comparingDouble(Announce::getMatchPercentage).reversed());

Вот небольшой пример использования простых двойных чисел:

public static void main(String[] args) {
    List<Double> list = new ArrayList<Double>();
    list.add(20.10);
    list.add(20.54);
    list.add(27.50);
    list.add(76.36);

    System.out.println("Before sort:");
    for(Double d : list) {
        System.out.println(d);
    }
    System.out.println();

    Collections.sort(list, new Comparator<Double>() {
        @Override
        public int compare(Double o1, Double o2) {
            return Double.compare(o2, o1);
        }
    });

    System.out.println("After sort:");
    for(Double d : list) {
        System.out.println(d);
    }
}

Вывод:

Before sort:
20.1
20.54
27.5
76.36

After sort:
76.36
27.5
20.54
20.1
0 голосов
/ 24 мая 2018

Начиная с Java 8, существует более удобный способ выполнить эту сортировку:

announceList.sort(Comparator.comparingDouble(Announce::getMatchPercentage).reversed());

Пропустить reversed() для сортировки списка в порядке возрастания.

Это позволяет использоватьметода comparingDouble(), который был новым в Java 8.

0 голосов
/ 24 мая 2018

Из документации Java Comparator::compare

Сравнивает два аргумента для порядка.Возвращает отрицательное целое число, ноль или положительное целое число, так как первый аргумент меньше, равен или больше второго.

Таким образом, для сортировки по возрастанию необходимо инвертировать порядокваших параметров для Integer.compare, например:

Integer.compare(i2, i1);

Или, как указано в комментарии:

return o1.getMatchPercentage().intValue() -o2.getMatchPercentage().intValue();

Однако для точности следует использовать Double.compare

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...