Comparator<String>
最初の単語がローマ数字である文字列がローマ数字で始まらない文字列の前にあるように文字列をソートするクラスを実装しています。両方の文字列がローマ字リテラルで始まる場合は、次の 2 つのケースがあります。
- ローマ数字でソートし、等しい場合は残りの文字列でソートします
- 文字列の残りの部分で並べ替え、ローマ数字と等しい場合
Guava のComparisonChainを使用したかったのですが、2 つの問題が発生しました。
- Eclipse でのデバッグ中、ComparisonChain オブジェクトの中身がわかりません (ComparisonChain クラスにいても)。
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
か、それともこの動作はバグですか?