Порівняння рядків у Java


Відповіді:


157

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

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

Повернення цього методу intможе бути інтерпретоване наступним чином:

  • повертає <0, тоді рядок, що викликає метод, лексикографічно першим (стоїть першим у словнику)
  • повертає == 0, тоді ці два рядки лексикографічно еквівалентні
  • повертає> 0, тоді параметр, переданий compareToметоду, є першим лексикографічно.

Більш конкретно, метод забезпечує першу ненульову різницю значень ASCII.

Таким чином "computer".compareTo ("comparison")поверне значення (int) 'u' - (int) 'a'(20). Оскільки це позитивний результат, параметр ( "comparison") є лексикографічно першим.

Існує також варіант , .compareToIgnoreCase ()який буде повертатися 0до "a".compareToIgnoreCase ("A");, наприклад.


Для порівняння порівнянь (тобто "é" еквівалентно "e") подивіться на download.oracle.com/javase/1.5.0/docs/api/java/text/…
Філіп

Просто незначна річ. "computer".compareTo ("comparison")поверне значення (int) 'u' - (int) 'a'20. Не (21).
Кодування погано

Мова, на якій знаходиться словник, також має значення. Для цього призначений Locale.
Thorbjørn Ravn Andersen

11

Формулювання "порівняння" злегка вводить в оману. Ви не порівнюєте для суворої рівності, але для того, який рядок стоїть на першому місці у словнику (лексиці).

Ця функція дозволяє сортувати колекції рядків.

Зауважте, що це дуже залежить від активної локалі. Наприклад, тут, у Данії, ми маємо символ "å", який раніше писався як "aa" і дуже відрізняється від двох одиничних a (EDIT: Якщо вимовляється як "å"!). Отже, датські правила сортування трактують два послідовних a однаково до "å", що означає, що воно йде після z. Це також означає, що датські словники сортуються інакше, ніж англійські чи шведські.


1
Цікаво! Чи порівнює javas щоб врахувати це?
aioobe

1
@aioobe, це пояснюється краще, ніж я можу, у підручнику Java: download.oracle.com/javase/tutorial/i18n/text/…
Thorbjørn Ravn Andersen


8

Порівнюючи послідовно літери, що мають однакову позицію одна проти одної .. більше, як порядок слів у словнику


6

Якщо ви перевірите, який рядок буде першим у лексиконі, ви зробили лексикографічне порівняння рядків!

Деякі посилання:

Викрадено з останнього посилання:

Рядок s передує рядку t у лексикографічному порядку, якщо

  • s - префікс t , або
  • якщо c і d - відповідно перший символ s і t, в якому s і t відрізняються, то c передує d у порядку символів.

Примітка: Для символів, які є алфавітними буквами, порядок символів збігається з алфавітним порядком. Цифри передують буквам, а великі - перед малими.

Приклад:

  • будинок передує господарству
  • Господарство передує будинку
  • композитор передує комп'ютеру - -
  • H2O передує HOTEL

3

Лексикографічний порядок 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
Kambiz
Саманта
k1ambiz
Камбиз

Зверніть увагу, що це відповідь на місцеву мову.
Зверніть увагу, що я фільтрую ім’я, що містить малу літеру a.


0

Нижче Алго "порівняти два рядки лексикографічно"

  1. Введіть два рядки рядок 1 і рядок 2.

  2. for (int i = 0; i <str1.length () && i <str2.length (); i ++)

    (Прокрутіть кожен символ обох рядків, порівнюючи їх, поки один із рядків не закінчиться):

    a. Якщо значення Unicode обох символів однакове, продовжуйте;

    b. Якщо значення Unicode символу рядка 1 і значення Unicode рядка 2 різне, поверніть (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, інакше поверне негативне або позитивне значення

Джерело: - Джерело

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.