Как искать в ArrayList?

Пытаюсь найти книгу по названию.

Допустим, существует книга «Джунгли». Я хочу найти это, даже если ищу

  • "JunGLE": работает,
  • «Юнг»: работает,
  • «JunG»: не работает.

Надеюсь, ты понимаешь. Я использую matches, чтобы добавить в поиск все книги, соответствующие этому названию. Кто-нибудь знает, как это исправить?

public ArrayList<Book> search(String title){
    ArrayList<Book> matches = new ArrayList<>(); 
    for (Book b : Books){
        String s = b.getTitle();
        if (s.equalsIgnoreCase(title)||s.trim().contains(title))
            matches.add(b);
    }
    return matches;
}

Метод contains не чувствителен к регистру

Mladen Savić 10.10.2018 17:14

почему Юнг, а не ДжунГ?

azro 10.10.2018 17:16

в основном конвертировать все в верхний (или нижний) s.toUpperCase().contains(title.toUpperCase())

user85421 10.10.2018 17:18

@azro что ты имеешь в виду? «Юнг» - это исходное имя, и я имею в виду, что если я буду искать по частям имени, я могу найти книгу, но если я буду искать по частям имени, но в верхнем регистре (как не в исходном имени) не работает .

Zuzu 10.10.2018 17:19

@Zuzu, вы должны лучше объяснить (отредактировать свой пост), вы имеете в виду, что это должно быть (то же самое слово без учета регистра) ИЛИ (часть слова с учетом регистра)?

azro 10.10.2018 17:21

Я бы выбрал более надежное решение на основе RegEx

Diego M. 10.10.2018 17:23

Итак, ваш код должен работать, объясните, что не работает

azro 10.10.2018 17:24

@azro вопрос довольно ясен, ОП говорят, что в настоящее время работает, а что нет.

Federico klez Culloca 10.10.2018 17:25

@FedericoklezCulloca, это неверный смысл, перечисление - это не ожидание, а то, что у него на самом деле есть, и каждый должен работать, но это вообще не сказано;)

azro 10.10.2018 17:27
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
9
68
1

Ответы 1

contains чувствителен к регистру, поэтому, если вам нужен поиск без учета регистра, то один из часто используемых методов - это принудительное использование обеих сторон одного и того же регистра (верхнего или нижнего, не имеет значения, если вы используете одно и то же с обеих сторон. ).

s.trim().toUpperCase().contains(title.toUpperCase())

Странная разница с Jung и JunG здесь не сработает, но это хорошее решение.

azro 10.10.2018 17:19

Конечно, это сработает, s ("Джунгли") будет преобразован в "JUNGLE", а title ("JunG") будет преобразован в JUNG, который содержится в s.

Federico klez Culloca 10.10.2018 17:23

Это не поиск без учета регистра, см. stackoverflow.com/a/6996550 для списка случаев, которые могут вызвать проблемы.

Ferrybig 10.10.2018 18:33

Другие вопросы по теме