【发布时间】: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 -> o.getClassificationCharacteristic().getAccuracy()).reversed()- reverseOrder() 只是颠倒了自然顺序 -
如果我这样做,我会得到“范围内已经定义了变量 'o'”
-
你的统计类是否实现了 Comparable 接口?
标签: java sorting limit comparator collect