Подтвердить что ты не робот

Сравнение строк в Java

Что означает "сравнить две строки лексикографически"?

4b9b3361

Ответ 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

Если вы проверите, какая строка будет первой в лексиконе, вы сделали лексикографическое сравнение строк!

Некоторые ссылки:

Украдено по последней ссылке:

Строка 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. Введите две строки: строку 1 и строку 2.

  2. for (int i = 0; i & lt; str1.length() && amp;   я & lt; str2.length(); я ++)

    (Перебрать каждый символ обоих Строки сравнивая их до одного строки заканчивается):

    а. Если Unicode значение обоих символов то же самое, затем продолжить;

    б. Если Юникод значение символа строка 1 и значение Юникода строки 2 отличается от return (str1 [i] -str2 [i])

  3. если длина строки 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, в противном случае вернет отрицательный или положительное значение

Источник: - Источник