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

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

70 голосов
/ 31 октября 2010

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

Ответы [ 6 ]

150 голосов
/ 31 октября 2010

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

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

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

  • возвращает <0, затем строка, вызывающая метод, сначала лексикографически (сначала в словаре) </li>
  • возвращает == 0, тогда две строки лексикографически эквивалентны
  • возвращает> 0, затем параметр, переданный методу compareTo, сначала лексикографически.

Более конкретно, метод обеспечивает первую ненулевую разницу в значениях ASCII.

Таким образом, "computer".compareTo ("comparison") вернет значение (int) 'u' - (int) 'a' (20). Поскольку это положительный результат, параметр ("comparison") сначала лексикографически.

Существует также вариант .compareToIgnoreCase (), который, например, вернет 0 для "a".compareToIgnoreCase ("A");.

11 голосов
/ 31 октября 2010

Формулировка «сравнение» слегка вводит в заблуждение. Вы сравниваете не строгое равенство, а то, какая строка стоит на первом месте в словаре (лексикон).

Эта функция позволяет сортировать коллекции строк.

Обратите внимание, что очень зависит от активной локали. Например, здесь, в Дании, у нас есть символ «å», который использовал для обозначения «aa» и очень отличается от двух одинарных a (РЕДАКТИРОВАТЬ: если произносится как »å «!). Следовательно, датские правила сортировки обрабатывают два последовательных а одинаково с "å", что означает, что оно идет после z. Это также означает, что датские словари отсортированы иначе, чем английские или шведские.

8 голосов
/ 31 октября 2010

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

8 голосов
/ 31 октября 2010

Метод String.compareTo(..) выполняет лексикографическое сравнение. Лексикографически == буквально.

6 голосов
/ 31 октября 2010

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

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

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

Строка s предшествует строке t в лексикографическом порядке, если

  • s - префикс t или
  • , если c и d - соответственно первый символ s и t , в котором s и t отличаются, тогда c предшествует d в порядке символов.

Примечание. Для букв алфавита порядок символов совпадает с алфавитным порядком. Цифры предшествуют буквам, а прописные буквы предшествуют строчным.

* +1047 * Пример: * +1048 *
  • дом предшествует домашнему хозяйству
  • Домохозяйство предшествует дому
  • композитор предшествует компьютеру
  • H2O предшествует HOTEL
2 голосов
/ 26 ноября 2016

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
Benjamin
Hayley
Jakey
Камбиз
Саманта
k1ambiz
Камбиз

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...