Сравнивайте решение toTo () и Collections.sort () для вопроса о множественном упорядочении столбцов (по возрастанию) - PullRequest
2 голосов
/ 18 апреля 2011

В некоторой степени запутался с поведением Java CompareTo () и Collections.sort ().

Я должен отсортировать столбец в порядке возрастания с помощью compareTo () & Collections.sort ().

Мой критерий (если встречается тот же номер, что и в следующем столбце).

(1) Номер документа (2) Дата проводки (3) Дата транзакции (4) Сравнение ссылочных номеров транзакций

Вот код (который выполняется в вызывающем методе), который реализует метод Collection.sort ():

public int compareTo(CreditCardTransactionDetail t) {
   int comparison = 0;

   int documentNumberComparison = this.getDocumentNumber().compareTo(t.getDocumentNumber());
   if (documentNumberComparison != 0) {
       comparison = documentNumberComparison;
   } 
   else {
       int postingDateComparison = this.getTransactionPostingDate().compareTo(t.getTransactionPostingDate());
       if (postingDateComparison != 0) {
           comparison = postingDateComparison;
       } 
       else {
           int transactionDateComparison = this.getTransactionDate().compareTo(t.getTransactionDate());
           if (transactionDateComparison != 0) {
               comparison = transactionDateComparison;
           }
           else {
               int transactionRefNumberComparison = this.getTransactionReferenceNumber().compareTo(t.getTransactionReferenceNumber());
               LOG.info("\n\n\t\ttransactionRefNumberComparison = " + transactionRefNumberComparison + "\n\n");
               if (transactionRefNumberComparison != 0) {
                   comparison = transactionRefNumberComparison;
               }
           }
       }
    return comparison;
}

Вопрос (ы):

(1) AmЯ правильно делаю?Когда сравнение = 0, оно возвращается как -2.Это правильное поведение, потому что я всегда думал, что оно между -1,0,1.

(2) Должен ли я использовать компаратор?

Счастливое программирование ...

Ответы [ 4 ]

4 голосов
/ 18 апреля 2011

Чтобы ответить на ваши конкретные вопросы:

  1. Да, это выглядит хорошо.Результат не обязательно должен быть равен -1, 0 или 1. Однако ваш код может быть немного менее подробным и просто возвращаться, как только найдет результат, не используя переменную comparison.
  2. Если вы используете Comparable, вам не нужно иметь дело с Comparator.Это для случаев, когда вам нужно сравнить что-то, что не Comparable или нужно сравнить другим способом.

Гуава класс ComparisonChain делает compareTo такой метод невероятно простым:

public int compareTo(CreditCardTransactionDetail o) {
  return ComparisonChain.start()
      .compare(getDocumentNumber(), o.getDocumentNumber())
      .compare(getTransactionPostingDate(), o.getTransactionPostingDate())
      .compare(getTransactionDate(), o.getTransactionDate())
      .compare(getTransactionReferenceNumber(), o.getTransactionReferenceNumber())
      .result();
}
2 голосов
/ 18 апреля 2011

Ответ для (1): Это правильно. см. javadoc Comparator.compare (T, T): " отрицательное целое число, ноль или положительное целое число, так как первый аргумент меньше, равен или больше второго. "

Или используйте Google Guava , который инкапсулирует Comparator для более простого и мощного использования:

  //Write 4 Comparators for each comparable field
 Ordering ordering = Ordering.from(comparatorDocumentNumber)
    .compound(comparatorTransactionPostingDate)
    .compound(comparatorTransactionDate)
    .compound(comparatorTransactionReferenceNumber);
 Collections.sort(list, ordering);

Он разделяет каждый компаратор, легко менять / добавлять / удалять порядок полей. РЕДАКТИРОВАТЬ: см. Более легкое решение ColinD.

0 голосов
/ 18 апреля 2011
  1. Согласно сопоставимой документации , compareTo():

    Returns a negative integer, zero, or a positive integer as this object 
    is less than, equal to, or greater than the specified object.
    

    Значит, -2 - верный результат.

  2. Это вопрос предпочтений, правда. Лично я предпочитаю использовать Comparator, но compareTo() работает так же хорошо. В любом случае ваш код будет выглядеть примерно одинаково.

0 голосов
/ 18 апреля 2011

Ваше сравнение достаточно разумно.compareTo может возвращать значения, отличные от -1,0,1.Просто отрицательный, 0 и положительный.

Вы должны использовать компаратор.

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