Кто-нибудь знает о библиотеке компараторов Java?

Мне нужна библиотека foss, которая включает в себя множество полезных реализаций Comparator, то есть множество маленьких скучных компараторов, готовых к работе.

Компараторы общего пользования Apache

  • обеспечить регресс
  • нулевой первый/нулевой последний
  • цепь
  • естественный
  • трансформатор

Есть так много других полезных многоразовых возможностей, которые недоступны.

  • игнорирование пробелов
  • нормализация пробелов
  • строки с числовым значением — например, «яблоко 10» > «яблоко 2».

@SPF Я включил некоторый псевдокод, который показывает, как можно нормализовать и сравнивать за один проход без создания каких-либо временных строк и т. Д. Хотя он не проверен и, вероятно, не работает, для быстрого быстрого сравнения не потребуется много времени.

while {

   while
        get next char from $string1
        if none left then
           $string1 > $string2 return +1;
        get next char from $string1
        increase $index1
        if previous was whitespace and this is whitespace then
           continue;
        end if
   end while

   while
    get next char from $string2
    if none left then
       $string2 > $string1 return +1;
    get next char from $string2
    increase $index2
    if previous was whitespace and this is whitespace then
       continue;
    end if
   end while

   result = $char1 - $char2
   if result != 0 return
}

person mP.    schedule 21.05.2011    source источник


Ответы (2)


Я не думаю, что вы получите много готовых компараторов, но Guava имеет Ordering, который расширяет компаратор функциональность и добавляет некоторые полезные реализации по умолчанию в качестве фабричного метода

А также: как Guava, так и Apache Commons/Lang (здесь: я сказал это) поможет вам реализовать собственные компараторы или компараторы, используя CompareToBuilder и ComparisonChain соответственно. Боюсь, лучше от этого не станет.


И об этих требованиях:

Есть так много других полезных многоразовых возможностей, которые недоступны.

  • игнорирование пробелов
  • нормализация пробелов
  • Строки с числовым значением — например, яблоко 10 › яблоко 2.

Неразумно делать что-либо из этого в компараторе, потому что это означает, что ваши неизмененные данные остаются в коллекции, и Comparator необходимо дважды выполнять требуемое преобразование для каждого сравнения. Теперь подумайте о сортировке массива с несколькими миллионами записей. Сколько преобразований String потребуется для этого?

Всегда разумнее сначала нормализовать данные, а затем отсортировать их.

person Sean Patrick Floyd    schedule 21.05.2011
comment
Не совсем - если бы это было правдой, тогда не было бы необходимости в компараторах, вы бы составили список сопоставимых. - person mP.; 22.05.2011
comment
Например, если кто-то использует comaprator в утилите сравнения, иногда вы хотите, чтобы различия игнорировали пробелы, а иногда нет. Переключение компараторов проще, чем очистка источников целиком. - person mP.; 22.05.2011
comment
@mP проще, да. Но и гораздо менее эффективен - person Sean Patrick Floyd; 23.05.2011
comment
@SPF, следуя моему образцу diff, сохраняет две полные копии, одну очищенную / нормализованную, а оригинал более хлопотным и грязным, чем сохранение только оригинала и чистота компаратора. Нормализация пробелов внутри Comparator.compare на самом деле не менее эффективна. Во всяком случае, это может быть даже больше, учитывая, что нет необходимости создавать полный дубликат. - person mP.; 26.08.2011
comment
@SPF re: очистка, продолжение с примером нормализации, который можно нормализовать, т. Е. Пропустить лишние пробелы при сравнении. Вам НЕ нужно сначала создавать чистую/деномрализованную копию, а затем выполнять сравнение. Вам вообще не нужно создавать никаких новых копий. - person mP.; 26.08.2011

Commons Lang, начиная с версии 3.0.2, будет иметь копию компараторов Collections в пакете org.apache.commons.lang3.compare. Не стесняйтесь предлагать больше.

person Hen    schedule 25.08.2011