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


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

6 61

6 ответов:

исходя из ответов от @Bozho и @aioobe, лексикографические сравнения похожи на порядок, который можно найти в словаре.

класс Java String предоставляет .compareTo () метод для лексикографического сравнения строк. Он используется так "apple".compareTo ("banana").

возврат этого метода является int что можно интерпретировать следующим образом:

  • возвращает
  • возвращает == 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(..) метод выполняет лексикографическое сравнение. Лексикографически = = буквенно.

сравнение последовательно буквы, которые имеют одинаковое положение друг против друга.. больше похоже на то, как вы заказываете слова в словаре

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

ссылки:

украдено из последней ссылки:

строка 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
Бенджамин
Хейли
Джейки
Камбиз
Саманта
k1ambiz
Камбиз

обратите внимание, что этот ответ зависит от локали.
Обратите внимание, что я фильтрую имя, содержащее строчную букву a.