3

Comparator<String>最初の単語がローマ数字である文字列がローマ数字で始まらない文字列の前にあるように文字列をソートするクラスを実装しています。両方の文字列がローマ字リテラルで始まる場合は、次の 2 つのケースがあります。

  1. ローマ数字でソートし、等しい場合は残りの文字列でソートします
  2. 文字列の残りの部分で並べ替え、ローマ数字と等しい場合

Guava のComparisonChainを使用したかったのですが、2 つの問題が発生しました。

  1. Eclipse でのデバッグ中、ComparisonChain オブジェクトの中身がわかりません (ComparisonChain クラスにいても)。
  2. comparisonChain.result()上記の 2 番目の例では、「XI サムシング」、「III サムシング」などの値に対して常に 0 を返します (問題 #1 のため、フローを検査できません) (long への変換は問題ありません - 値を確認しました)。

ここで何が問題なのですか?上記のようにオブジェクトを使用できますcomparisonChain(変数を作成.compareし、ビルダーのようにいくつかの if に s を追加することにより)、できませんか?

このコード:

  if (romanComparisionFirst) {
    return ComparisonChain.start()
        .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord))
        .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator)
        .result();
  } else {
    return ComparisonChain.start()
        .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator)
        .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord))
        .result();
  }

この:

  final ComparisonChain comparisionChain = ComparisonChain.start();
  if (romanComparisionFirst) {
    comparisionChain
        .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord))
        .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator);
  } else {
    comparisionChain
        .compare(WORDS_JOINER.join(leftWordsTail), WORDS_JOINER.join(rightWordsTail), collator)
        .compare(Roman.toLong(leftFirstWord), Roman.toLong(rightFirstWord));
  }
  return comparisionChain.result();

異なる結果が得られます - 最初のケースは問題ありませんが、2 番目のケースは常に 0 です。質問は、2 番目のケースの場合、示されているように使用できますComparisonChainか、それともこの動作はバグですか?

4

1 に答える 1

11

の各compareメソッドは をComparisonChain返しますがComparisonChain、これは必ずしも比較が呼び出されるチェーンではありません。最初のスニペットは結果を無視していません (したがって正しいです) が、2 番目のスニペットは結果を無視しているため、正しくありません。

もしそうなら、それは正しいでしょう:

comparisionChain = comparisionChain.compare(...).compare(...);

ソース コードについては、http://docs.guava-libraries.googlecode.com/git-history/v10.0.1/javadoc/src-html/com/google/common/collect/ComparisonChain.html#line.89を参照してください。

于 2011-12-12T22:17:15.043 に答える