У меня есть класс, реализующий Comparator<String>
, который должен сортировать строки таким образом, чтобы строки с первым словом, являющимся римским числом, были перед строкой, которая не начинается с римского номера, и если обе строки начинаются с римского литерала, должно бытьдва случая:
- сортировка по римскому номеру и затем, если он равен остатку строки
- сортировка по остатку строки и, если он равен римскому номеру
Я хотел использовать ComparisonChain в Guava, но столкнулся с двумя проблемами:
- Во время отладки в Eclipse я не вижу, что находится внутри объекта ComparisonChain (даже находясь в классе ComparisonChain).
comparisonChain.result()
во втором примере выше всегда возвращает 0 (я не могу проверить поток из-за проблемы # 1) для таких значений, как «XI Something», «III Something» и т. Д. (Преобразование в long - это нормально - я проверилзначения).
В чем здесь проблема?Я могу использовать объект comparisonChain
, как указано выше (создавая переменные и добавляя .compare
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();
дают разные результаты - первый случай в порядке, второй всегда 0. Итак, вопрос: Могу ли я использовать ComparisonChain
, как показано, если второй случай или это поведение ошибка?