Що означає "порівняти два рядки лексикографічно"?
Відповіді:
Виходячи з відповідей @Bozho та @aioobe, лексикографічні порівняння подібні до впорядкування, яке можна знайти у словнику.
Клас Java String забезпечує .compareTo ()
метод для лексикографічного порівняння рядків. Його використовують так "apple".compareTo ("banana")
.
Повернення цього методу int
може бути інтерпретоване наступним чином:
compareTo
методу, є першим лексикографічно.Більш конкретно, метод забезпечує першу ненульову різницю значень ASCII.
Таким чином "computer".compareTo ("comparison")
поверне значення (int) 'u' - (int) 'a'
(20). Оскільки це позитивний результат, параметр ( "comparison"
) є лексикографічно першим.
Існує також варіант , .compareToIgnoreCase ()
який буде повертатися 0
до "a".compareToIgnoreCase ("A");
, наприклад.
"computer".compareTo ("comparison")
поверне значення (int) 'u' - (int) 'a'
20. Не (21).
Формулювання "порівняння" злегка вводить в оману. Ви не порівнюєте для суворої рівності, але для того, який рядок стоїть на першому місці у словнику (лексиці).
Ця функція дозволяє сортувати колекції рядків.
Зауважте, що це дуже залежить від активної локалі. Наприклад, тут, у Данії, ми маємо символ "å", який раніше писався як "aa" і дуже відрізняється від двох одиничних a (EDIT: Якщо вимовляється як "å"!). Отже, датські правила сортування трактують два послідовних a однаково до "å", що означає, що воно йде після z. Це також означає, що датські словники сортуються інакше, ніж англійські чи шведські.
String.compareTo(..)
Метод виконує порівняння лексикографічного. Лексикографічно == алфавітно.
Якщо ви перевірите, який рядок буде першим у лексиконі, ви зробили лексикографічне порівняння рядків!
Деякі посилання:
Викрадено з останнього посилання:
Рядок s передує рядку t у лексикографічному порядку, якщо
- s - префікс t , або
- якщо c і d - відповідно перший символ s і t, в якому s і t відрізняються, то c передує d у порядку символів.
Примітка: Для символів, які є алфавітними буквами, порядок символів збігається з алфавітним порядком. Цифри передують буквам, а великі - перед малими.
Приклад:
- будинок передує господарству
- Господарство передує будинку
- композитор передує комп'ютеру - -
- H2O передує HOTEL
Лексикографічний порядок 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
Benjamin
Hayley
Jakey
Kambiz
Саманта
k1ambiz
Камбиз
Зверніть увагу, що це відповідь на місцеву мову.
Зверніть увагу, що я фільтрую ім’я, що містить малу літеру a.
Нижче Алго "порівняти два рядки лексикографічно"
Введіть два рядки рядок 1 і рядок 2.
for (int i = 0; i <str1.length () && i <str2.length (); i ++)
(Прокрутіть кожен символ обох рядків, порівнюючи їх, поки один із рядків не закінчиться):
a. Якщо значення Unicode обох символів однакове, продовжуйте;
b. Якщо значення Unicode символу рядка 1 і значення Unicode рядка 2 різне, поверніть (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, інакше поверне негативне або позитивне значення
Джерело: - Джерело