Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在新hashmap中对参数进行排序,而不是返回主_Java_Sorting_Machine Learning_Hashmap_Knn - Fatal编程技术网

Java在新hashmap中对参数进行排序,而不是返回主

Java在新hashmap中对参数进行排序,而不是返回主,java,sorting,machine-learning,hashmap,knn,Java,Sorting,Machine Learning,Hashmap,Knn,我正在做一个KNN项目,我正在尝试对我在一个新的hashmap中计算的欧几里德距离和索引进行排序,然后将它们带回我的主目录。这是我对距离进行排序的代码。但是,public int compare()函数只返回int,我不能将其设置为public double compare(),因为我的所有距离都是double,所以我不能使用此函数。我将非常感谢您的帮助,非常感谢 HashMap<Integer, KnnBundle> knnBundleHashMap = new HashMap&l

我正在做一个KNN项目,我正在尝试对我在一个新的hashmap中计算的欧几里德距离和索引进行排序,然后将它们带回我的主目录。这是我对距离进行排序的代码。但是,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();
    }
});
HashMap knnBundleHashMap=newhashmap();
//cnt是尺寸
对于(int i=0;i
使用
双精度。比较:

return Double.compare(o1.getEuclid2(), o2.getEuclid2());
一般来说,您不应该在比较方法中使用减法,因为它不能正确处理溢出、正零与负零、NaN等情况

在Java 8+中,您可以更轻松地编写以下代码:

   List<KNNBundle>sortedEuclid =
       knnBundleHaspMap.values()
           .stream()
           .sorted(Comparator.comparingDouble(KNNBundle::getEuclid2))
           .collect(Collectors.toList());
ListsortedEuclid=
knnBundleHaspMap.values()
.stream()
.sorted(Comparator.comparingDouble(KNNBundle::getEuclid2))
.collect(Collectors.toList());

使用
双精度。比较:

return Double.compare(o1.getEuclid2(), o2.getEuclid2());
一般来说,您不应该在比较方法中使用减法,因为它不能正确处理溢出、正零与负零、NaN等情况

在Java 8+中,您可以更轻松地编写以下代码:

   List<KNNBundle>sortedEuclid =
       knnBundleHaspMap.values()
           .stream()
           .sorted(Comparator.comparingDouble(KNNBundle::getEuclid2))
           .collect(Collectors.toList());
ListsortedEuclid=
knnBundleHaspMap.values()
.stream()
.sorted(Comparator.comparingDouble(KNNBundle::getEuclid2))
.collect(Collectors.toList());

对此有多种解决方法。 在Java 8或更新版本中:

List sorted = knnBundleHaspMap.values().stream().sort((b1, b2) -> Double.compare(b1.Euclid2(), b2.Euclid2()).collect(Collectors.toList());
使用您创建的比较器,只需将compare函数的内容替换为以下内容:

Double.compare(b1.Euclid2(), b2.Euclid2())

对此有多种解决方案。 在Java 8或更新版本中:

List sorted = knnBundleHaspMap.values().stream().sort((b1, b2) -> Double.compare(b1.Euclid2(), b2.Euclid2()).collect(Collectors.toList());
使用您创建的比较器,只需将compare函数的内容替换为以下内容:

Double.compare(b1.Euclid2(), b2.Euclid2())
Collections.sort(sorteduclid,newcomparator(){
公共整数比较(KNNnBundle o1,KNNnBundle o2){
返回o1.getEuclid2()>o2.getEuclid2()?1:o1.getEuclid2()
Collections.sort(sorteduclid,新的比较器(){
公共整数比较(KNNnBundle o1,KNNnBundle o2){
返回o1.getEuclid2()>o2.getEuclid2()?1:o1.getEuclid2()
如果JAVA 8

为了提升

下降

如果JAVA 7和JAVA 6

Collections.sort(sortedEuclid, new Comparator<KNNBundle>() {

    public int compare(KNNBundle o1, KNNBundle o2) {
        return o1.getEuclid2().compareTo(o2.getEuclid2());
    }
});
Collections.sort(sorteduclid,newcomparator(){
公共整数比较(KNNnBundle o1,KNNnBundle o2){
返回o1.getEuclid2().compareTo(o2.getEuclid2());
}
});
如果JAVA 8

为了提升

下降

如果JAVA 7和JAVA 6

Collections.sort(sortedEuclid, new Comparator<KNNBundle>() {

    public int compare(KNNBundle o1, KNNBundle o2) {
        return o1.getEuclid2().compareTo(o2.getEuclid2());
    }
});
Collections.sort(sorteduclid,newcomparator(){
公共整数比较(KNNnBundle o1,KNNnBundle o2){
返回o1.getEuclid2().compareTo(o2.getEuclid2());
}
});

这不能正确工作,因为它不是反对称的(它不能正确处理NaN或正/负零)。@而且我很清楚NaN部分。但我不理解“它不能正确处理正/负零”)。我通常这样做是为了避免溢出:尽管是“相等的”,+ve和-ve零是不同的值,因此应该有一个定义的顺序。所以,它不是-ve零的反对称性,它只是不一致性。这不能正确工作,因为它不是反对称的(它不能正确处理NaN或正/负零)。@反过来,我很清楚NaN部分。但我不明白“它不能正确处理正/负零”。我通常这样做是为了避免溢出:尽管是“相等的”,+ve和-ve零是不同的值,因此应该有一个定义的顺序。所以,-ve zero不是反对称的,它只是不一致。“如果JAVA 7和JAVA 6”只在
getEuclid2()
返回
Double
而不是
Double
时才起作用。是的,我接受使用
Double.compare(o1.getEuclid2(),o2.getEuclid2())
。我认为它是双包装。“如果JAVA 7和JAVA 6”只在
getEuclid2()
返回
Double
而不是
Double
时才有效。是的,我接受使用
Double.compare(o1.getEuclid2(),o2.getEuclid2())
。我还以为是双层的呢。