Сравнение строк в Java
Что означает" сравнить две строки лексикографически"?
6 ответов:
исходя из ответов от @Bozho и @aioobe, лексикографические сравнения похожи на порядок, который можно найти в словаре.
класс Java String предоставляет
.compareTo ()
метод для лексикографического сравнения строк. Он используется так"apple".compareTo ("banana")
.возврат этого метода является
int
что можно интерпретировать следующим образом:
- возвращает
- возвращает == 0 тогда две строки лексикографически эквивалентны
- возвращает > 0, затем параметр передается в
compareTo
метод лексикографически первый.более конкретно, метод обеспечивает первую ненулевую разницу в значениях ASCII.
"computer".compareTo ("comparison")
возвращает значение(int) 'u' - (int) 'a'
(21). Так как это положительный результат, то параметр ("comparison"
) лексикографически первый.есть и вариант
.compareToIgnoreCase ()
что вернет0
на"a".compareToIgnoreCase ("A");
например.
формулировка "сравнение" слегка вводит в заблуждение. Вы не сравниваете для строгого равенства, но для которого строка занимает первое место в словаре (лексиконе).
Это функция, которая позволяет сортировать коллекции строк.
обратите внимание, что это очень зависит от активного языка. Например, здесь в Дании у нас есть символ "å", который используется пишется как "aa" и очень отличается от двух одиночных a (EDIT: If произносится как "å"!). Следовательно, датские правила сортировки обрабатывают два последовательных a тождественно "å", что означает, что он идет после z. это также означает, что датские словари сортируются иначе, чем английские или шведские.
на
String.compareTo(..)
метод выполняет лексикографическое сравнение. Лексикографически = = буквенно.
сравнение последовательно буквы, которые имеют одинаковое положение друг против друга.. больше похоже на то, как вы заказываете слова в словаре
Если вы проверите, какая строка будет первой в лексиконе, вы сделали лексикографическое сравнение строк!
ссылки:
- Wikipedia-String (computer science) Лексикографическое упорядочение
- примечание по сравнению: лексикографическое сравнение между строками
украдено из последней ссылки:
строка s предшествует строке t в лексикографическом порядке если
- s - это префикс t или
- если c и d являются соответственно первым символом s и t, в котором s и t отличаются, то c предваряет d в последовательность символов.
Примечание: Для символов, которые являются буквами алфавита, порядок символов совпадает с алфавитный порядок. Цифры предшествуют буквам,а прописные буквы-строчным.
пример:
- дом предшествует домашнему хозяйству
- домашнее хозяйство предшествует дому
- композитор предваряет компьютер
- H2O предшествует отель
Java лексикографически порядок:
- цифры -до-
- верхний регистр-перед -
- строчные буквы
странно, как это кажется, это правда...
мне пришлось написать цепочки компараторов, чтобы иметь возможность изменить поведение по умолчанию.
поиграйте со следующим фрагментом с лучшими примерами входных строк для проверки порядка (вам понадобится JSE 8):import java.util.ArrayList; public class HelloLambda { public static void main(String[] args) { ArrayList<String> names = new ArrayList<>(); names.add("Kambiz"); names.add("kambiz"); names.add("k1ambiz"); names.add("1Bmbiza"); names.add("Samantha"); names.add("Jakey"); names.add("Lesley"); names.add("Hayley"); names.add("Benjamin"); names.add("Anthony"); names.stream(). filter(e -> e.contains("a")). sorted(). forEach(System.out::println); } }
результат
1Bmbiza
Бенджамин
Хейли
Джейки
Камбиз
Саманта
k1ambiz
Камбизобратите внимание, что этот ответ зависит от локали.
Обратите внимание, что я фильтрую имя, содержащее строчную букву a.