Проблема почти наверняка NaN
.
Это, как следует из названия, не является действительным числом и ведет себя очень странно с точки зрения сравнений.NaN
больше, равно или меньше 0.5773502691896258
?Это может быть любой из этих результатов, и даже не требуется быть согласованным в рамках одного выполнения программы.NaN
даже не равен самому себе, что говорит о том, как предвзятые представления о законах равенства и строгого упорядочения выходят из окна, когда задействован NaN
.
Так что исправитьиспользуйте нечисловое значение и ожидайте, что Double.compareTo()
сделает с ним то, что вы хотите.В зависимости от того, что NaN
означает при возврате из similarityScore()
, существует несколько подходов.Если это означает, что это совсем не совпадение, вы можете заставить этот метод возвращать Double
(а не double
), возвращать null
в этих случаях, а затем добавлять только ненулевые результаты на карту.Если эти результаты все равно будут отображаться, то, возможно, вы могли бы использовать результат 0.0
или -1.0
, предполагая, что это меньше, чем любой «реальный» показатель сходства.Если вы хотите что-то более изощренное, то, вероятно, возникнет проблема с возвратом чего-то такого же простого и ясного, как примитивный двойник, и вам может потребоваться вместо этого вернуть свой собственный (простой) класс домена.Как в стороне - с какой стати вы создаете и заполняете HashMap
, а затем используете TreeSet
, чтобы получить порядок итераций для ключей?Если вы просто создаете m
как TreeMap<Double, String> you get exactly the iteration order you want, so can just iterate over
m.entrySet () `.Это яснее, идиоматичнее (и, следовательно, более понятно) и более эффективно, поэтому нет причин не делать этого.