не могу отсортировать следующую карту дерева - PullRequest
1 голос
/ 27 марта 2011
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

Этот код должен быть в состоянии сортировать двойные значения. Но он отображает вывод сверху. Что происходит ?

Ответы [ 4 ]

2 голосов
/ 27 марта 2011
for (int ii = 0; ii < 11; ii++) {
    m.put(similarityScore[a],pre + a + post + '\n');
}

Это помещает одно и то же значение в карту 11 раз - вы не ссылаетесь на ii внутри цикла.

for (Double d : set) {
    System.out.println(d + " " + m.get(d));
}

Это печатает одну запись на карте.

Вы делаете выше для значений 0..filename - добавление значения к карте несколько раз, затем печать его и перезапуск с новой картой.

Map<Double,String> m = new HashMap<Double,String>();
for (a = 0; a < filename; a++) {
  String pre = "abc";
  String post = ".txt";
  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..filename, затем распечатывает его отсортированным.У вас все еще будут проблемы с NaN, который на самом деле не сортируется.

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

И при этом используется TreeMap - нет необходимости в промежуточном Set

2 голосов
/ 27 марта 2011

Проблема почти наверняка 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 () `.Это яснее, идиоматичнее (и, следовательно, более понятно) и более эффективно, поэтому нет причин не делать этого.

0 голосов
/ 27 марта 2011

Ваш цикл означает, что вы сортируете для каждого имени файла отдельно.Вам нужно вытащить сортировку из цикла, чтобы отсортировать эти значения.(Упс, Эрик побил меня этим.)

0 голосов
/ 27 марта 2011

Для сортировки любой коллекции тип значения, по которому вы сортируете, должен быть одинаковым.И должен реализовать сопоставимый интерфейс.

В вашем случае у вас есть значения NaN и Double для сортировки.

...