Treeset Внутренний процесс Строки - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть следующий код, но я не могу понять вывод, как TreeSet производит следующий вывод. Как TreeSet хранит объекты внутри?

import java.util.*;

class TreeSetDemo{

    public static void main(String args[]){

        TreeSet<String> treeset = new TreeSet<String>(); 

        treeset.add("Geeks");
        treeset.add("for");
        treeset.add("GeeksforGeeks");
        treeset.add("a");
        treeset.add("d");
        treeset.add("c");
        treeset.add("b");

        for(String temp:treeset)
            System.out.printf(temp+ " ");
        System.out.println("\n");
    }
}

Выход:

Geeks GeeksforGeeks a b c d for

1 Ответ

0 голосов
/ 08 сентября 2018

Я не могу понять вывод как то, как treeset производит следующий вывод. Может ли кто-нибудь объяснить мне, как TreeSet хранит объекты внутри.

Согласно его документам , TreeSet хранит свои элементы в TreeMap (в качестве ключей). Со своей стороны, TreeMap хранит свои элементы в красно-черном дереве , которое является основой для имен обоих классов. Если вы не знаете, красно-черное дерево - это форма двоичного дерева поиска.

Что касается вывода, есть две основные вещи, которые нужно понять:

  1. TreeSet - это набор с сортировкой . Если вы инициализируете один с Comparator, то это определяет порядок сортировки. В противном случае, как и в вашем случае, он использует естественный порядок элементов. Итераторы набора возвращают элементы в отсортированном порядке.

  2. Естественный порядок классов String является лексикографическим, основанным на числовых значениях char элементов каждого String.

Вы не объяснили, как полученный вами результат отличается от того, что вы ожидали, но я полагаю, что он должен иметь отношение к порядку строк. Возможно, вы ожидали, что они будут повторяться в том же порядке, в котором вы добавили их в набор, но я уже рассмотрел, почему это не было бы разумным ожиданием.

Или, возможно, вы были удивлены тем, что заглавные 'G' сортируются перед всеми строчными буквами, включая, например, строчные буквы 'a'. Числовые значения Java char s представляют кодировку Unicode в кодировке UTF-16, что соответствует ASCII для кодовых точек 0 - 127. В Интернете доступно множество кодовых диаграмм ASCII, а также диаграмм Unicode. Любое из них скажет вам, что кодовая точка Unicode для «G» равна 71 (десятичному), а для «a» - 97, поэтому действительно (под) строки, начинающиеся с «G», выполняют сортировку до тех, которые начинаются с «a» в естественный порядок java.lang.String с.

...