【问题标题】:How to sort list of objects in reversed manner? [duplicate]如何以相反的方式对对象列表进行排序? [复制]
【发布时间】:2021-05-17 13:22:06
【问题描述】:

我有一个统计类对象的列表。它包含以下属性:

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()”部分收到错误消息“无法解析 'Object' 中的方法 '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;
    }

希望它与问题相关。

【问题讨论】:

  • 错误 "Cannot resolve method 'getClassificationCharacteristic' in 'Object'" 表明并非sorted 之前的管道中的所有对象都具有getClassificationCharacteristic 方法。例如map 之后的某些对象可能为空。
  • 但是,如果我只是从中删除“reversed()”,为什么这段代码可以正常工作呢?正确,但它不符合我的要求。
  • 除此之外,不应该是.sorted(Comperator.comparingDouble(o -&gt; o.getClassificationCharacteristic().getAccuracy()).reversed() - reverseOrder() 只是颠倒了自然顺序
  • 如果我这样做,我会得到“范围内已经定义了变量 'o'”
  • 你的统计类是否实现了 Comparable 接口?

标签: java sorting limit comparator collect


【解决方案1】:

我错了。 @Eritrean 在 cmets 中提供的答案确实是正确的。非常感谢您的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    相关资源
    最近更新 更多