Что означает "сравнить две строки лексикографически"?
Сравнение строк в Java
Ответ 1
Исходя из ответов @Bozho и @aioobe, лексикографические сравнения похожи на порядок, который можно найти в словаре.
Класс Java String предоставляет метод .compareTo ()
для лексикографического сравнения строк. Он используется так "apple".compareTo ("banana")
.
Возвращением этого метода является int
, который можно интерпретировать следующим образом:
- возвращает & lt; 0 тогда строка, вызывающая метод, сначала лексикографически (сначала в словаре)
- возвращает == 0, тогда две строки лексикографически эквивалентны
- возвращает> 0, затем параметр, переданный методу
compareTo
, сначала лексикографически.
Более конкретно, метод обеспечивает первую ненулевую разницу в значениях ASCII.
Таким образом, "computer".compareTo ("comparison")
вернет значение (int) 'u' - (int) 'a'
(20). Поскольку это положительный результат, параметр ("comparison"
) в первую очередь лексикографически.
Существует также вариант .compareToIgnoreCase ()
, который, например, будет возвращать 0
для "a".compareToIgnoreCase ("A");
.
Ответ 2
Формулировка "сравнение" мягко вводит в заблуждение. Вы не сравниваете строгое равенство, но для какой строки сначала в словаре (лексиконе).
Это функция, которая позволяет сортировать коллекции строк.
Обратите внимание, что это очень зависит от активной локали. Например, здесь, в Дании, у нас есть символ "å" , который раньше был записан как "aa" и очень отличается от двух одиночных a (EDIT: если произносится как "å" !). Следовательно, датские правила сортировки трактуют два консективных а тождественно на "å" , что означает, что оно идет после z. Это также означает, что датские словари сортируются по-другому, чем английские или шведские.
Ответ 3
Метод String.compareTo(..)
выполняет лексикографическое сравнение. Лексикографически == альфебит.
Ответ 4
Сравнение последовательно букв, имеющих одну и ту же позицию друг против друга.. больше похоже на то, как вы заказываете слова в словаре
Ответ 5
Если вы проверите, какая строка будет первой в лексиконе, вы сделали лексикографическое сравнение строк!
Некоторые ссылки:
- Wikipedia - String (информатика) Лексикографический порядок
- Примечание по сравнению: лексикографическое сравнение между строками
Украдено по последней ссылке:
Строка s предшествует строке t в лексикографическом порядке, если
- s является префиксом t или
- если c и d являются соответственно первыми символами s и t, в которых s и t различаются, то c предшествует d в порядке символов.
Примечание. Для букв алфавита порядок символов совпадает с алфавитным порядком. Цифры предшествуют буквам, а прописные буквы предшествуют строчным.
Example:
- дом предшествует домашнему хозяйству
- Домашнее хозяйство предшествует дому
- композитор предшествует компьютеру
- H2O предшествует ОТЕЛЬ
Ответ 6
Java лексикографически упорядочивает:
- Числа -before-
- Верхний предел - прежде -
- Строчные
Нечетный, как кажется, это правда...
Мне пришлось писать цепочки компараторов, чтобы иметь возможность изменять поведение по умолчанию.
Играйте со следующим фрагментом с лучшими примерами строк ввода, чтобы проверить порядок (вам понадобится 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
Benjamin
Hayley
Jakey
Камбиз
Саманта
k1ambiz
Камбиз
Обратите внимание, что это ответ специфичен для локали.
Обратите внимание, что я фильтрую имя, содержащее строчную букву a.
Ответ 7
Ниже Алго "сравнить две строки лексикографически"
Введите две строки: строку 1 и строку 2.
for (int i = 0; i & lt; str1.length() && amp; я & lt; str2.length(); я ++)
(Перебрать каждый символ обоих Строки сравнивая их до одного строки заканчивается):
а. Если Unicode значение обоих символов то же самое, затем продолжить;
б. Если Юникод значение символа строка 1 и значение Юникода строки 2 отличается от return (str1 [i] -str2 [i])
если длина строки 1 меньше, чем string2
вернуть str2 [str1.length()]
еще
вернуть str1 [str2.length()]
//Этот метод сравнивает две строки лексикографически
public static int compareCustom(String s1, String s2) { for (int i = 0; i < s1.length() && i< s2.length(); i++) { if(s1.charAt(i) == s2.charAt(i)){ //System.out.println("Equal"); continue; } else{ return s1.charAt(i) - s2.charAt(i); } } if(s1.length()<s2.length()){ return s2.length() - s1.length(); } else if(s1.length()>s2.length()){ return s1.length()-s2.length(); } else{ return 0; } }
если две строки равны, он вернет 0, в противном случае вернет отрицательный или положительное значение
Источник: - Источник