java - 无法对以下 TreeMap 进行排序

标签 java loops treeset

for (a = 0; a < filename; a++) {
  Map<Double,String> m = new HashMap<Double,String>();

  String pre = "abc";
  String post = ".txt";
  for (int ii = 0; ii < 11; ii++) {
    m.put(similarityScore[a],pre + a + post + '\n');
  }
  SortedSet<Double> set = new TreeSet<Double>(m.keySet());
  for (Double d : set) {
    System.out.println(d + " " + m.get(d));
  }
}

输出:

0.5773502691896258 abc0.txt
0.5773502691896258 abc1.txt
0.5773502691896258 abc2.txt
NaN abc3.txt
0.5773502691896258 abc4.txt
NaN abc5.txt
NaN abc6.txt
NaN abc7.txt
NaN abc8.txt
0.5773502691896258 abc9.txt
NaN abc10.txt

此代码应该能够对 double 值进行排序。但它在顶部显示输出。发生什么事 ?

最佳答案

问题几乎可以肯定是NaN .

顾名思义,这不是一个实数,并且在比较方面表现得非常奇怪。是NaN大于、等于或小于 0.5773502691896258 ?它可以是这些结果中的任何一个,甚至不需要在程序的单次执行中保持一致。 NaN甚至不等于自己,这说明了当 NaN 时,关于平等法则和强排序的先入之见是如何消失的。参与其中。

因此解决方法是不使用非数字并期望 Double.compareTo()用它做你想做的事。看什么NaN 表示similarityScore()返回时,您可以采用多种方法。如果这意味着它根本不匹配,您可以让该方法返回 Double (而不是 double ),返回 null在这些情况下,然后仅将非空结果添加到 map 。如果无论如何都应该显示这些结果,那么也许您可以使用 0.0 的结果。或 -1.0 ,假设它小于任何“真实”相似性分数。如果您想要更精致的东西,那么返回像原始 double 这样纯粹和直接的东西可能会成为问题,您可能需要返回您自己的(简单的)域类。


顺便说一句 - 你到底为什么要创建并填充 HashMap , 然后使用 TreeSet获取键的迭代顺序?如果您只是创建 m作为TreeMap<Double, String> you get exactly the iteration order you want, so can just iterate over m.entrySet()`。它更清晰、更惯用(因此更易于理解)和更高效,因此没有理由不这样做。

关于java - 无法对以下 TreeMap 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5449107/

相关文章:

java - 如何根据用户输入在 TreeSet 中添加特定数量的对象?

java - 为什么 switch 语句中的 case 没有自己的作用域?

java - 分解 Java 字符串中的复合算术表达式

java - java 文本字段和文本区域的 float 输入

java - 练习循环中断或返回

java - 修剪已排序的集合

java - 重写compareTo(T t)

java - 如何从 ifs 文本文件中提取 2D double 组 (Java)

database - 在 Delphi 中,我应该在循环中使用多个数据库插入还是使用存储过程?

java - 使用 Break Java Scanner 单独求和