Как отсортировать список объектов в обратном порядке?

У меня есть список объектов статистического класса. Он содержит следующие атрибуты:

private String name;
private double min;
private double max;
private double avg;
private double stDev;
private double variation;
private double skewness;
private double median;
private double q1;
private double q3;
private double sum;
private int count;

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

String filePath = "src/test/resources/json/test_write_to_file.json";
SimulationOption option = JsonUtil.read(filePath);

MainController mainController = new MainController();
List<CrossValidationResult> results = mainController.start(option);

int N = 5;

List<Statistic> testingStatistics = ClassificationStatisticHelper.calculateClassificationResultsStatistics(results
                        .parallelStream()
                        .map(CrossValidationResult::getTestingResults)
                        .sorted(Comparator.comparingDouble(o->o.getClassificationCharacteristic().getAccuracy()).reversed())
                        .limit(N)
                        .collect(Collectors.toList()));

Я получаю сообщение об ошибке Не удается разрешить метод getClassificationCharacteristic в объекте в части getClassificationCharacteristic(). Эта ошибка исчезает, если я удаляю .reversed, но тогда я получаю N результатов снизу, а не сверху N. Очевидно, это неправильный способ делать то, что я хотел сделать. Как мне это исправить?

РЕДАКТИРОВАТЬ:

List<Statistic> testingStatistics = ClassificationStatisticHelper.calculateClassificationResultsStatistics(results
                        .parallelStream()
                        .map(CrossValidationResult::getTestingResults)
                        .sorted(Comparator.reverseOrder().thenComparingDouble(o->o.getClassificationCharacteristic().getAccuracy()))
                        .limit(N)
                        .collect(Collectors.toList()));

Не работает также

РЕДАКТИРОВАТЬ 2: getClassificationCharacteristic().getAccuracy() происходит от com.common.metrics.ClassificationCharacteristic. Вот как это рассчитывается:

private void calculateAccuracy() {
        int correctSum = 0;
        for (int i = 0; i < classes.length; i++) {
            correctSum += matrix[i][i];
        }
        int instances = classActualSupport.values().parallelStream().reduce(Integer::sum).orElse(0);
        this.accuracy = 1d * correctSum / instances;
    }

Надеюсь, это имеет отношение к проблеме.


person MegaKruk    schedule 17.05.2021    source источник
comment
Ошибка Не удается разрешить метод getClassificationCharacteristic в объекте предполагает, что не все объекты в конвейере до sorted имеют метод getClassificationCharacteristic. Например, некоторые объекты могут быть нулевыми после map.   -  person SomeDude    schedule 17.05.2021
comment
Но тогда почему этот код работает правильно, если я просто удаляю из него reversed()? Правильно, но он не делает то, что я хочу.   -  person MegaKruk    schedule 17.05.2021
comment
кроме того, разве это не должно быть .sorted(Comperator.comparingDouble(o -> o.getClassificationCharacteristic().getAccuracy()).reversed() - reverseOrder() просто меняет естественный порядок   -  person Daniel Wosch    schedule 17.05.2021
comment
Если я это сделаю, я получу переменную 'o', которая уже определена в области видимости.   -  person MegaKruk    schedule 17.05.2021
comment
Реализует ли ваш класс статистики интерфейс Comparable?   -  person Daniel Wosch    schedule 17.05.2021
comment
Попробуйте привести переменную к нужному классу: .sorted(Comparator.comparingDouble(o->((CrossValidationResult)o).getClassificationCharacteristic().getAccuracy()).reversed())   -  person Majo    schedule 17.05.2021
comment
Хорошо, давайте начнем с самого начала. Откуда getClassificationCharacteristic().getAccuracy()? Не могли бы вы предоставить соответствующие части кода? В противном случае это немного похоже на тупик в темноте   -  person Daniel Wosch    schedule 17.05.2021
comment
@Majo К сожалению, это тоже не работает   -  person MegaKruk    schedule 17.05.2021
comment
Я отредактировал вопрос, чтобы также указать, откуда берется getClassificationCharacteristic().getAccuracy()   -  person MegaKruk    schedule 17.05.2021
comment
@MegaKruk, пожалуйста, укажите, какой тип класса возвращает функция CrossValidationResult::getTestingResults. Компаратор зависит от этого типа.   -  person Majo    schedule 17.05.2021
comment
@Eritrean К сожалению, это также не работает: ```Список‹Статистика› testingStatistics = ClassificationStatisticHelper.calculateClassificationResultsStatistics(results .parallelStream() .map(CrossValidationResult::getTestingResults) //.sorted(Comparator.comparingDouble(o-›o. getClassificationCharacteristic().getAccuracy())) .sorted(Comparator.comparing((Statistics) -> s.getAvg()).reversed()) .limit(N) .collect(Collectors.toList())); ```   -  person MegaKruk    schedule 17.05.2021
comment
@Majo Возвращает тип EvaluationDataResults   -  person MegaKruk    schedule 17.05.2021
comment
@MegaKruk, попробуй так: .sorted(Comparator.comparingDouble(o->((EvaluationDataResults) o).getClassificationCharacteristic().getAccuracy()).reversed())   -  person Majo    schedule 17.05.2021


Ответы (1)


Я ошибался. Ответ, представленный в комментариях @Eritrean, действительно правильный. Большое спасибо за помощь

person MegaKruk    schedule 17.05.2021