Зачем добавлять нулевой символ \0 при поиске headSet в SortedSet?

Что означает эта идиома? Строка Java, объединенная с «\ 0» (например, «Япония \ 0»)? Как в

SortedSet<String> countryHeadSet 
    = countrySet.headSet("Japan\0");

Что означает строка "Japan\0" в вызове? Будет ли какая-то разница, если программист напишет просто

countryHeadSet 
    = countrySet.headSet("Japan");

person leeyuiwah    schedule 29.01.2017    source источник
comment
Вы смотрели на этот вопрос? stackoverflow .com/questions/9753576/   -  person Sandip Subedi    schedule 30.01.2017
comment
'\0' символ равен null символу   -  person Mohsen_Fatemi    schedule 30.01.2017
comment
На самом деле это символ NUL, как и char, известный как нулевой символ, но не null, который является ключевым словом Java и не применяется к примитивным типам. Я упоминаю об этом, потому что слова такие похожие, но значения такие разные. en.wikipedia.org/wiki/Null_character unicode-table.com/en docs.oracle.com/javase/specs/jls/se8/html/   -  person Lew Bloch    schedule 30.01.2017
comment
Привет, спасибо за всю помощь. Я нашел ответ и предоставил его ниже. Спасибо!   -  person leeyuiwah    schedule 30.01.2017


Ответы (1)


Я нашел ответ. Спасибо за все идеи.

Одно из применений идиомы строки + "\0", особенно когда вы видите ее с операцией представления диапазона SortedSet, заключается в использовании ее для поиска преемника строки.

Такой преемник необходим, потому что эти операции представления диапазона (subSet() , headSet() и tailSet()) предоставляют полуоткрытые интервалы, и вам может понадобиться преемник строки для создания закрытого интервал. Это объясняется в Java Doc of Sorted Set

Несколько методов возвращают подмножества с ограниченными диапазонами. Такие диапазоны являются полуоткрытыми, то есть они включают свою нижнюю конечную точку, но не включают верхнюю конечную точку (где это применимо). Если вам нужен закрытый диапазон (который включает в себя обе конечные точки), а тип элемента позволяет вычислить преемника заданного значения, просто запросите поддиапазон от lowEndpoint до преемника (highEndpoint). Например, предположим, что s — отсортированный набор строк. Следующая идиома позволяет получить представление, содержащее все строки в s от младших до старших включительно:

SortedSet sub = s.subSet(low, high+"\0");

Другими словами, разница между двумя вызовами ниже:

countrySet.headSet("Japan\0");
countrySet.headSet("Japan")

заключается в том, что первый из них получит все строки в countrySet в диапазоне от начала набора до включая строку "Japan" (т. е. диапазон является замкнутым интервал); а второй получит все строки в диапазоне от начала набора до но не включая строку "Japan" (т.е. диапазон представляет собой полуоткрытый интервал ).

Я включаю собственную тестовую программу, чтобы продемонстрировать использование идиомы:

import java.util.Arrays;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;

public class StringPlusNull {

    public static void main(String[] args) {
        List<String> countryList 
            = Arrays.asList("U.S.", "U.K.", "China", "Japan", "Korea");
        SortedSet<String> countrySet
            = new TreeSet<>(countryList);

        String toElement = "Japan";
        SortedSet<String> countryHeadSet 
            = countrySet.headSet(toElement);
        System.out.format("There are %d countries in the "
                + "(half-open) headset [, %s): %s%n"
                , countryHeadSet.size(), toElement, countryHeadSet);

        toElement = "Japan\0";
        countryHeadSet 
            = countrySet.headSet(toElement);
        System.out.format("There are %d countries in the "
                + "(half-open) headset [, %s): %s%n"
                , countryHeadSet.size(), toElement, countryHeadSet);
    }

}

Результат будет:

There are 1 countries in the (half-open) headset [, Japan): [China]
There are 2 countries in the (half-open) headset [, Japan ): [China, Japan]
person leeyuiwah    schedule 29.01.2017