Сравнение строк в Java
Что означает" сравнить две строки лексикографически"?
6 ответов
ведущий из ответов от @Bozho и @aioobe, лексикографические сравнения похожи на порядок, который можно найти в словаре.
класс Java String предоставляет .compareTo ()
метод для лексикографического сравнения строк. Используется такой "apple".compareTo ("banana")
.
возврат этого метода является int
который можно интерпретировать следующим образом:
- возвращает
- returns == 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(..)
метод выполняет лексикографическое сравнение. Лексикографически = = буквенно.
сравнивая sequencially буквы, которые имеют одинаковое положение по отношению друг к другу.. больше похоже на то, как вы заказываете слова в словаре
Если вы проверите, какая строка будет первой в лексиконе, вы сделали лексикографическое сравнение строк!
ссылки:
- Википедия-строка (информатика) Лексикографическое упорядочение
- примечание по сравнению: лексикографическое сравнение между строками
украдено из последней ссылки:
строка 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
Бенджамин!--12-->
Хейли!--12-->
Джейки!--12-->
Камбиз!--12-->
Саманта!--12-->
k1ambiz
Камбиз!--26-->
обратите внимание, что это ответ конкретной локали.
Обратите внимание, что я фильтрую имя, содержащее строчную букву a.