Сравнение строк в 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 лексикографически порядок:

  1. цифры -до-
  2. верхний регистр-перед -
  3. строчные

Как это ни странно, это правда...
мне пришлось написать цепочки компараторов, чтобы изменить поведение по умолчанию.
поиграйте со следующим фрагментом с лучшими примерами входных строк для проверки порядка (вам понадобится 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.