1
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 値をソートできるはずです。ただし、出力は一番上に表示されます。何が起きましたか ?

4

4 に答える 4

2

問題はほぼ確実NaNです。

名前が示すように、これは実際の数値ではなく、比較に関して非常に奇妙な動作をします。NaNより大きいか、等しいか、またはより小さいですか0.5773502691896258? これらの結果のいずれかである可能性があり、プログラムの 1 回の実行内で一貫している必要さえありません。 NaNはそれ自体と等しくさえありません。これは、平等の法則と強い秩序の先入観が、 が関係するときにどのように窓の外に出るかについて何かを言いますNaN.

したがって、修正は、数値以外を使用せず、それを使用しDouble.compareTo()て必要なことを行うことを期待することです。から戻ったときのNaN 意味に応じてsimilarityScore()、いくつかの方法があります。まったく一致しないことを意味する場合は、そのメソッドにDouble( ではなくdouble) を返させnull、これらの場合に返してから、null 以外の結果のみをマップに追加することができます。とにかくこれらの結果を表示する必要がある場合は、「実際の」類似度スコアよりも低いと仮定して、おそらく0.0orの結果を使用できます。-1.0より洗練されたものが必要な場合は、プリミティブ double のように純粋で単純なものを返すことが問題になる可能性が高く、代わりに独自の (単純な) ドメイン クラスを返す必要がある場合があります。


余談ですが、一体なぜ a を作成して入力しHashMap、 a を使用TreeSetしてキーの反復順序を取得するのですか? 単にm.entrySet()`mとして作成する場合。TreeMap<Double, String> you get exactly the iteration order you want, so can just iterate overより明確で、より慣用的で (したがって、より理解しやすく)、より効率的であるため、これを行わない理由はありません。

于 2011-03-27T12:15:09.473 に答える
2
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));
}

そして、これはaを使用しますTreeMap-中間体は必要ありませんSet

于 2011-03-27T12:15:48.117 に答える
0

コレクションを並べ替えるには、並べ替える値の型が同じである必要があります。また、同等のインターフェースを実装する必要があります。

あなたの場合、ソートする NaN と Double の値があります。

于 2011-03-27T12:16:03.097 に答える
0

ループは、ファイル名ごとに個別にソートしていることを意味します。これらの値をソートするには、ソートをループから引き出す必要があります。(おっと、@Ericは私を打ち負かしました。)

于 2011-03-27T12:22:02.847 に答える