Главная страница » Как сравнить 2 list игнорируя регистр java

Как сравнить 2 list игнорируя регистр java

  • автор:

Функция посимвольного сравнения строк без учета регистра

Напишите функцию, которая принимает две строки a и b и сравнивает строки без учета регистра. Возвращает -1, если a < b. 0, если a == b. 1, если a > b.

Строка может содержать символы с кодами с 32 по 126. Максимальная длина строки 10^6 символов.

Решаю эту задачу, но вывод получаю неверный.

Пожалуйста подскажите что именно не верно в моем коде

ВОТ РАБОЧИЙ ВАРИАНТ:

Если что ))) всем спасибо!!

Ваша задача сводится к тому, чтобы привести строки к одному регистру (если это цифра, то её не надо приводить, разумеется — добавьте такое условие), а вот потом уже сравнивать. И тогда это и будет "сравнение без учета регистра". У вас есть два варианта, как это сделать. Например, как посоветовал Alexander Chernin: получать массив char[] преобразованием из String , и перебирать каждый символ. Т.е. при переборе элементов массива Вы проверяете: если это буква, то какая? Например (можно и наоборот, "безучетностьрегистра" останется та же (: ) , видите заглавную — приводите к строчной, видите строчную — оставляете, как есть. И потом уже сравниваете значения a[i] и b[i] .

Или же можно сделать лаконичнее: поищите методы класса String toLowerCase() и toUpperCase() . На выходе имеете String, у которого все символы — одного регистра. А дальше просто сравниваете, одним циклом.)

И еще, попробуйте суммировать символы своих строк. Т.е. привели к одному регистру буквы, а дальше суммируете все элементы через цикл. Почему так? Потому что по таблице ASCII слово HELLO будет "меньше" слова RIVER, например. Хотя количество букв одно. Или, например, слова RIVER и STILL: видимо, мы должны вернуть -1, т.к. R "меньше" S. Но на деле суммы их кодов равны..

Сопоставление строк без учета регистра в Java

Узнайте, как выполнить сопоставление строк без учета регистра в Java.

  • Автор записи

1. Обзор

Существует множество способов проверить, содержит ли строка подстроку . В этой статье мы будем искать подстроки внутри String , сосредоточившись на обходных путях без учета регистра для String.contains() в Java. Самое главное, мы приведем примеры того, как решить эту проблему.

2. Самое Простое Решение: Строка.toLowerCase

Самое простое решение-использовать String.toLowerCase() . В этом случае мы преобразуем обе строки в нижний регистр, а затем используем метод contains() :

Мы также можем использовать String.toUpperCase (), и это даст тот же результат.

3. Строка.спички С Регулярными Выражениями

Другой вариант-использовать String.matches() с регулярными выражениями:

Метод matches() принимает как попытку представить регулярное выражение. (?i) включает нечувствительность к регистру и .* использует все символы, кроме разрывов строк.

4. String.regionMatches

Мы также можем использовать String.regionMatches() . Он проверяет, совпадают ли две области String , используя true для параметра IgnoreCase :

Чтобы повысить производительность, он начинает сопоставлять регион с учетом длины целевой строки . Затем он уменьшает итератор.

5. Шаблон С параметром CASE_INSENSITIVE

Класс java.util.regex.Pattern предоставляет нам способ сопоставления строк с помощью метода matcher () . В этом случае мы можем использовать метод quote() для экранирования любых специальных символов и флаг CASE_INSENSITIVE . Давайте посмотрим:

6. Apache Commons StringUtils.containsIgnoreCase

Наконец, мы воспользуемся классом Apache Commons StringUtils:

7. Сравнение Производительности

Как и в этой общей статье о проверке подстрок с помощью метода contains , мы использовали фреймворк с открытым исходным кодом Java Microbenchmark Harness (JMH) для сравнения производительности методов в наносекундах :

  1. Регулярное выражение Pattern CASE_INSENSITIVE: 399.387 нс
  2. Строка toLowerCase : 434.064 ns
  3. Apache Commons StringUtils : 496.313 ns
  4. Совпадения области строки : 718.842 нс
  5. Строка совпадает с регулярным выражением : 3964.346 ns

Как мы видим, победителем является Pattern с включенным флагом CASE_INSENSITIVE , за которым следует toLowerCase() . Мы также заметили явное улучшение производительности между Java 8 и Java 11.

8. Заключение

В этом уроке мы рассмотрели несколько различных способов проверки String на наличие подстроки, игнорируя при этом случай в Java.

Сравните два списка на равенство в Java, игнорируя порядок

В этом посте будет обсуждаться, как сравнить два списка на равенство в Java, игнорируя порядок. Список может быть списком примитивных типов или списком объектов. Два списка считаются равными, если они содержат одинаковые элементы в одинаковом количестве в любом порядке.

Например, [1, 2, 3] а также [2, 1, 3] считаются равными, а [1, 2, 3] а также [2, 4, 3] не. Количество элементов также имеет значение, следовательно, [1, 2, 3, 1] а также [2, 1, 3, 2] не относятся одинаково. Если количество элементов не имеет значения, вы можете преобразовать оба списка в набор и сравнить их, используя .equals() метод интерфейса Set.

1. Сортировка

Простое решение состоит в том, чтобы отсортировать оба списка а затем сравните их с помощью .equals() метод List интерфейс. Обратите внимание, что это решение не является линейным и имеет O(n.log(n)) временная сложность. Это не подходит для больших списков.

Для повышения эффективности рекомендуется сначала проверить, имеют ли оба списка одинаковый размер или нет. Также перед сортировкой обоих списков создайте их копию, чтобы не нарушить исходный порядок обоих списков. Как копирование, так и сортировку можно эффективно выполнять с помощью Streams API, как показано ниже.

Есть ли чистый способ игнорировать регистр при сравнении List<String>?

И это кажется довольно подробным для этого, плюс я действительно не хотел бы делать предположение о том, что второй список будет полностью строчным. Это делает его гораздо более хрупким для будущих изменений.

Есть ли способ лучше?

3 ответа

Поскольку вы сравниваете размеры, я предполагаю, что порядок имеет значение, поскольку списки представляют собой упорядоченные коллекции. Код, показанный в вопросе, игнорирует порядок.

Чтобы сравнить все элементы без учета регистра по порядку, вы должны параллельно выполнить итерацию обоих списков. Поскольку get(int) не является быстрым для всех реализаций List , лучше всего использовать параллельную итерацию с использованием Iterator :

Я предполагаю, что вы хотите сравнить 2 списка.

Убедитесь, что ни один из списков не является нулевым.

Проверять элементы в списках (включая порядок строк(?), но не регистр)

Если ты попал сюда. Все наверное хорошо.

Как заметил Андреас, для списков, которые реализованы как LinkedList , get(..) дает плохую производительность. Подход, основанный на iterator , как его ответ, решает эту проблему.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *