Игнорируйте слово «the» при сортировке коллекции Java

В настоящее время у меня есть код, который принимает имена файлов и сортирует их по-разному (чувствительный к региону естественный сорт, нечувствительный к регистру ASCII-разрядный тип, по дате изменения и т. Д.), Например, для чувствительного к локали естественного сорта он использует это:

Collections.sort(files, new Comparator() {
    @Override
    public int compare(File f1, File f2) {
        return NaturalComparator.compareNatural(collator, f1.getName(), f2.getName());
    }
});

Я хотел бы знать, как заставить его игнорировать слово «the» в начале имени файла, поэтому вместо упорядочивания таких файлов:

Apple,
Морковь
Банан

Он приказывает им:

Apple,
Банан

Морковь

4
nl ja de

4 ответы

Вы можете заменить первое вхождение The , прежде чем передавать его компаратору, используя Строка # replaceFirst (регулярное выражение, замена) или String.replaceAll (regex, replacement) , оба из которых заменяют параметр regex , и оба могут использоваться здесь: -

@Override
public int compare(File f1, File f2) {
    return NaturalComparator.compareNatural(collator, 
                                          f1.getName().replaceAll("^(?i)The ", ""), 
                                          f2.getName().replaceAll("^(?i)The ", ""));
}  

Добавлен флаг (? I) перед шаблоном регулярного выражения для замены без учета регистра (спасибо @Chris за указание этого).

Caret (^) is added before the pattern, so that it replaces only the The at the beginning of the string. So, The banana will be replaced with banana, but Banana, The will not be replaced with Banana,. It will remain the same.

5
добавлено
Только один случай. Если String не начинается с «The», и он входит между ними как Appthe (просто пример). ReplaceAll с regex будет хорошей идеей, я думаю
добавлено автор xyz, источник
Ударьте меня на это :) Вы, вероятно, захотите сделать нечувствительную к регистру замену, чтобы поймать «как», так и «The»
добавлено автор Krease, источник
@Ajinkya .. Хорошая уловка. Взял за это.
добавлено автор Rohit Jain, источник
@Chris .. Спасибо за указание. Отредактировано соответственно. :)
добавлено автор Rohit Jain, источник
@EricTobias .. Конечно, это зависит от всех возможных имен файлов и как рассматривать каждую из них при сортировке, которую должен сказать OP.
добавлено автор Rohit Jain, источник
@SubJunk .. Добро пожаловать :)
добавлено автор Rohit Jain, источник
Какое поведение вы хотели бы в случае, если «The» добавлено как в «Banana, The»? Возможно, вы захотите нормализовать свои записи в этом формате перед сортировкой. Все зависит от цели вашего проекта.
добавлено автор Eric, источник
Работает отлично, спасибо!
добавлено автор SubJunk, источник
Collections.sort(files, new Comparator() {
    @Override
    public int compare(File f1, File f2) {
        return NaturalComparator.compareNatural(collator, f1.getName().startsWith("The  ")?f1.getName().substring(4) : f1.getName(), f2.getName().startsWith("The ")?f2.getName().substring(4):f2.getName();
    }
});
0
добавлено
static String ignoreThe(String s) {
    if (s.length > 3) {
        if (s.substring(0, 4).toLowerCase().equal("the ")) {
            return s.substring(0, 4);
        }
    }
    return s;
}

Collections.sort(files, new Comparator() {
    @Override
    public int compare(File f1, File f2) {
        String name1 = ignoreThe(f1.getName()); 
        String name1 = ignoreThe(f2.getName()); 
        return name1.compareTo(name2);
    }
});
0
добавлено

пытаться

...
return NaturalComparator.compareNatural(collator, f1.getName().replaceAll("^The ", ""), f2.getName().replaceAll("^The ", ""));
0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async