При выполнении сравнения строк Java какие значения для ~ (тильда) имеют место? - PullRequest
0 голосов
/ 27 января 2020

Например:

public static void smallestWord() {
    String smallestWord = "~";
    List<String> words = new ArrayList<>();
    words.add("dba");
    words.add("dba");
    words.add("eba");
    words.add("dca");
    words.add("eca");

    for (String word : words) {
        if (word.compareTo(smallestWord) < 0) {
            smallestWord = word;

        }
    }
}

Возвращает dba как наименьшее слово, которое является правильным, но я изначально инициализировал наименьшее слово как ~, если я оставляю его пустым или ., я не получить правильный ответ. Какое значение имеет ~ в Java лексикографии?

Ответы [ 3 ]

3 голосов
/ 27 января 2020

Все символы в Java сравниваются по их кодовой точке Unicode. ~ - это U + 007E (126) в Unicode, который больше, чем все стандартные латинские символы ASCII, но меньше, чем символы из всех других сценариев или латинские символы с ударениями. Для получения более подробной информации о том, как сравниваются строки, вы можете прочитать String.compareTo JavaDo c.

Что вы хотите сделать, скорее всего, что-то вроде этого:

public static void smallestWord() {
    String smallestWord = null;
    List<String> words = new ArrayList<>();
    words.add("dba");
    words.add("dba");
    words.add("eba");
    words.add("dca");
    words.add("eca");

    for (String word : words) {
        if ((smallestWord == null) || (word.compareTo(smallestWord) < 0)) {
            smallestWord = word;
        }
    }
}

Или, альтернативно, используйте стандартную библиотеку:

Collections.min(words);
0 голосов
/ 27 января 2020

Как уже отмечали другие '~' - это символ ASCII / код Unicode, который больше всех букв ASCII; т. е. верхний и нижний регистр от «A» до «Z».

Следовательно, согласно спецификации 1 класса String, "~" следует после любого слова Engli sh.

Однако кодовая точка '~' НЕ меньше, чем буквы с ударением и буквы в нелатинских алфавитах. Так что трюк "~" не будет работать с кириллицей c или хинди. И если вы можете подумать о французском / немецком / португальском / et c слове с акцентированной первой буквой, оно не будет работать и на этих языках.

И с Emojis это тоже не сработает.

Короче говоря, этот код, использующий "~", как в вашем примере, не будет работать в интернационализированном контексте.

Вы можете использовать null согласно ответу @ Dolda2000, или вы можете использовать "\u10ffff".

(\u10ffff - максимально возможная кодовая точка Unicode. Однако этот подход также не является абсолютно надежным. Существуют допустимые строки Java, которые больше, чем "\ u10ffff"; например, "\ u10ffffZZZZ ". К сожалению, максимально возможное строковое значение не может быть записано как строковый литерал, и его представление смехотворно велико - примерно 2 ^ 31 байт!)


1 - порядок строк основан на упорядочении кодовых единиц UTF-16, а не на кодовых точках Unicode. Но для правильно сформированных струн нет разницы в двух способах мышления об этом.

0 голосов
/ 27 января 2020

compareTo работает со значением символа Unicode, ~ имеет значение Unicode больше, чем алфавиты, поэтому он работает, в то время как пробел и точка имеют значение Unicode меньше алфавитов, поэтому он считает их маленькими и печатает их одинаково.

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