Например:

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?

0
orange 27 Янв 2020 в 03:11

3 ответа

Лучший ответ

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

То, что вы хотите сделать, это, вероятно, что-то вроде этого:

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);
3
Dolda2000 27 Янв 2020 в 00:21

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

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

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

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

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

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

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


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

0
Stephen C 29 Янв 2020 в 04:36

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

0
Deepak Jain 27 Янв 2020 в 00:19