Использование ComparisonChain в Guava для сравнения строк, содержащих римские числа - PullRequest
3 голосов
/ 13 декабря 2011

У меня есть класс, реализующий Comparator<String>, который должен сортировать строки таким образом, чтобы строки с первым словом, являющимся римским числом, были перед строкой, которая не начинается с римского номера, и если обе строки начинаются с римского литерала, должно бытьдва случая:

  1. сортировка по римскому номеру и затем, если он равен остатку строки
  2. сортировка по остатку строки и, если он равен римскому номеру

Я хотел использовать ComparisonChain в Guava, но столкнулся с двумя проблемами:

  1. Во время отладки в Eclipse я не вижу, что находится внутри объекта ComparisonChain (даже находясь в классе ComparisonChain).
  2. 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, как показано, если второй случай или это поведение ошибка?

1 Ответ

11 голосов
/ 13 декабря 2011

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

Было бы правильно, если бы это было:

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 для исходный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...