我正在研究KNN项目,并且正在尝试对在新的哈希图中计算出的欧几里得距离以及索引进行排序,而不是将它们带回到我的主距离。这是我的距离排序代码。但是,public int compare()函数仅返回int,我无法将其设置为public double compare(),并且由于我的所有距离都是double,因此我无法使用此函数。我将不胜感激,非常感谢。
HashMap<Integer, KnnBundle> knnBundleHashMap = new HashMap<Integer, knnBundle>();
// cnt is the size
for(int i = 0; i< cnt; i++){
knnBundleHaspMap.put(i, newKnnBundle(xarray[i], yarray[i], classes[i], euclid[i]);
}
// not yet sorted
List<KNNBundle>sortedEuclid = new ArrayList<knnBundle>(knnBundleHaspMap.values());
Collections.sort(sortedEuclid, new Comparator<KNNBundle>() {
public int compare(KNNBundle o1, KNNBundle o2) {
return o1.getEuclid2() - o2.getEuclid2();
}
});
最佳答案
使用Double.compare
:
return Double.compare(o1.getEuclid2(), o2.getEuclid2());
通常,您不应该在比较方法中使用减法,因为它不能正确处理溢出,正零Vs负零,NaN等问题。
在Java 8+中,您可以这样编写:
List<KNNBundle>sortedEuclid =
knnBundleHaspMap.values()
.stream()
.sorted(Comparator.comparingDouble(KNNBundle::getEuclid2))
.collect(Collectors.toList());