TreeSet的使用方法總結、實現原理、使用示例

目錄

 

存儲特點:有序,不重複;key不能爲空,value可以爲null(總結一點:凡是有Tree的集合,都是有序的,凡是有Set的就是不重複的)

底層原理:使用NavigableMap,但NavigableMap只是一個接口,最終是使用TreeMap

構造函數

public TreeSet():底層創建新的TreeMap

public TreeSet(Collection c):通過集合構造TreeSet

public TreeSet(Comparator comparator):自定義比較器的TreeSet

如果Treeset存儲的是對象,可以通過對象實現Comparator,實現自定義對象比較器

public TreeSet(SortedSet s):通過set構造TreeSet

常用方法

public boolean add(E e):添加元素

public  boolean addAll(Collection c):通過集合添加元素

public E ceiling(E e):返回大於或等於給定鍵值的最小鍵值

public void clear():清空集合

public Object clone():克隆集合

public Comparator comparator():用於在此樹映射中維護順序的比較器,如果使用其鍵的自然順序,則爲null

public boolean contains(Object o) :是否包含摸個元素

public Iterator descendingIterator():用於按降序迭代元素。

public NavigableSet descendingSet():?

public E first():獲取首點

public E floor(E e):返回小於或等於給定鍵值的最大鍵值

public SortedSet headSet(E toElement):返回key<=toElement集合

public NavigableSet headSet(E toElement, boolean inclusive):返回key<=toElement集合,inclusive=true返回的集合在原set中,會包含自己,否則不會包含

public E higher(E e):返回嚴格大於給定鍵值的最小鍵值

public boolean isEmpty():判斷集合是否爲空

public Iterator iterator() :迭代輸出

public E last():獲取最後的值

public E lower(E e):返回嚴格小於給定鍵值的最大鍵值

public E pollFirst():獲取第一個值並移除第一個值

public E pollLast():獲取最後值並移除這個值

public boolean remove(Object o):移除元素

public int size() :當前set容量

public Spliterator spliterator() : 方法用於拆分set元素,並逐個迭代它們。

public NavigableSet subSet(E fromElement, boolean fromInclusive, E toElement,   boolean toInclusive):返回from到to之間的值,fromInclusive和toInclusive代表是否包含當前值

public SortedSet subSet(E fromElement, E toElement):返回from到to之間的值,包含from,不包含to,即【左閉右開)

public SortedSet tailSet(E fromElement):返回>=fromElement值的集合元素

public NavigableSet tailSet(E fromElement, boolean inclusive)返回>=fromElement值的集合元素,inclusive=true包含自身,=false就不包含


存儲特點:有序,不重複;key不能爲空,value可以爲null(總結一點:凡是有Tree的集合,都是有序的,凡是有Set的就是不重複的)

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        set.add(3);
        set.add(2);
        set.add(5);
        set.add(1);
        set.add(3);
        System.out.println(set);
    }
}

結果:

[1, 2, 3, 5]

 

底層原理:使用NavigableMap,但NavigableMap只是一個接口,最終是使用TreeMap

構造函數

public TreeSet():底層創建新的TreeMap

public TreeSet(Collection<? extends E> c):通過集合構造TreeSet

demo

public class Test {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(3);
        list.add(3);
        list.add(2);
        list.add(1);
        list.add(4);
        TreeSet set = new TreeSet(list);

        System.out.println("list:"+list);
        System.out.println("set:"+set);
    }
}

結果:

list:[3, 3, 2, 1, 4]
set:[1, 2, 3, 4]

public TreeSet(Comparator<? super E> comparator):自定義比較器的TreeSet

如果Treeset存儲的是對象,可以通過對象實現Comparator,實現自定義對象比較器

實體類Person,實現Comparator接口

public class Person implements Comparable {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    //實現比較方法
    @Override
    public int compareTo(Object o) {
        Person p = (Person) o;
        return this.age - p.getAge();
    }
}

測試類

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        set.add(new Person("成龍",13));
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));
        System.out.println("set:"+set);
    }
}

結果:年齡從低到高排列

set:[Person{name='劉亦菲', age=11}, 
Person{name='成龍', age=13}, 
Person{name='周星馳', age=16}, 
Person{name='胡歌', age=22}, 
Person{name='李連杰', age=56}]

public TreeSet(SortedSet<E> s):通過set構造TreeSet

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        set.add(new Person("成龍",13));
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));

        TreeSet t = new TreeSet(set);

        System.out.println("set:"+set);

        t.add(new Person("楊超越",18));
        System.out.println("t:"+t);
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='成龍', age=13}, Person{name='周星馳', age=16}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
t:[Person{name='劉亦菲', age=11}, Person{name='成龍', age=13}, Person{name='周星馳', age=16}, Person{name='楊超越', age=18}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]

常用方法

public boolean add(E e):添加元素

public  boolean addAll(Collection<? extends E> c):通過集合添加元素

public class Test {
    public static void main(String[] args) {
        List list = new ArrayList();
        list.add(3);
        list.add(3);
        list.add(2);
        list.add(1);
        list.add(4);
        TreeSet set = new TreeSet(list);

        System.out.println("list:"+list);
        System.out.println("set:"+set);
    }
}

結果:

list:[3, 3, 2, 1, 4]
set:[1, 2, 3, 4]

public E ceiling(E e):返回大於或等於給定鍵值的最小鍵值

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",12);
        set.add(new Person("成龍",13));
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));

        System.out.println("set:"+set);
        System.out.println(set.ceiling(person));
    }
}

結果:最接近古天樂年紀的是成龍,所有結果是成龍

set:[Person{name='劉亦菲', age=11}, Person{name='成龍', age=13}, Person{name='周星馳', age=16}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
Person{name='成龍', age=13}

public void clear():清空集合

public Object clone():克隆集合

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",12);
        set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));

        TreeSet clone = (TreeSet)set.clone();

        System.out.println("set:"+set);
        clone.remove(person);
        System.out.println("clone:"+clone);
    }
}

結果:

set:[Person{name='劉亦菲', age=11}, Person{name='古天樂', age=12}, Person{name='周星馳', age=16}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
clone:[Person{name='劉亦菲', age=11}, Person{name='周星馳', age=16}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]

public Comparator<? super E> comparator():用於在此樹映射中維護順序的比較器,如果使用其鍵的自然順序,則爲null

public boolean contains(Object o) :是否包含摸個元素

public Iterator<E> descendingIterator():用於按降序迭代元素。

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",23);
        Person person2 = new Person("楊超越",18);
        set.add(person);
        set.add(person2);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",18));
        set.add(new Person("李連杰",56));


        System.out.println("set:"+set);
        Iterator iterator = set.descendingIterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

結果:

set:[Person{name='劉亦菲', age=11}, Person{name='楊超越', age=18}, Person{name='胡歌', age=22}, Person{name='古天樂', age=23}, Person{name='李連杰', age=56}]
Person{name='李連杰', age=56}
Person{name='古天樂', age=23}
Person{name='胡歌', age=22}
Person{name='楊超越', age=18}
Person{name='劉亦菲', age=11}

 

public NavigableSet<E> descendingSet():?

public E first():獲取首點

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",12);
        set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));

        System.out.println("set:"+set);
        System.out.println("set:"+set.first());
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='古天樂', age=12}, Person{name='周星馳', age=16}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
set:Person{name='劉亦菲', age=11}

public E floor(E e):返回小於或等於給定鍵值的最大鍵值

demo

public class Test {
    public static void main(String[] args) {

        TreeSet set = new TreeSet();
        Person person = new Person("古天樂", 23);
        //set.add(person);
        set.add(new Person("胡歌", 22));
        set.add(new Person("劉亦菲", 11));
        set.add(new Person("周星馳", 16));
        set.add(new Person("李連杰", 56));

        System.out.println("set:" + set);
        System.out.println(set.floor(person));
    }
}

結果:比23最小的是22 

set:[Person{name='劉亦菲', age=11}, Person{name='周星馳', age=16}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
Person{name='胡歌', age=22}

public SortedSet<E> headSet(E toElement):返回key<=toElement集合

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",18);
        //set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));

        System.out.println("set:"+set);
        System.out.println("返回age小於person.age的元素set:"+set.headSet(person));
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='周星馳', age=16}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
返回age小於person.age的元素set:[Person{name='劉亦菲', age=11}, Person{name='周星馳', age=16}]

 

public NavigableSet<E> headSet(E toElement, boolean inclusive):返回key<=toElement集合,inclusive=true返回的集合在原set中,會包含自己,否則不會包含

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",18);
        set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));

        System.out.println("set:"+set);
        System.out.println("返回age小於person.age的元素set:"+set.headSet(person,false));
    }
}

結果:返回的結果包含person自己,如果是false就不會包含

set:[Person{name='劉亦菲', age=11}, Person{name='周星馳', age=16}, Person{name='古天樂', age=18}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
返回age小於person.age的元素set:[Person{name='劉亦菲', age=11}, Person{name='周星馳', age=16}]

public E higher(E e):返回嚴格大於給定鍵值的最小鍵值

demo:person上面有

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",18);
        set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));

        System.out.println("set:"+set);
        System.out.println("返回嚴格大於給定鍵值的最小鍵值:"+set.higher(person));
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='周星馳', age=16}, Person{name='古天樂', age=18}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
返回嚴格大於給定鍵值的最小鍵值:Person{name='胡歌', age=22}

public boolean isEmpty():判斷集合是否爲空

public Iterator<E> iterator() :迭代輸出

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",18);
        set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));

        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

結果

Person{name='劉亦菲', age=11}
Person{name='周星馳', age=16}
Person{name='古天樂', age=18}
Person{name='胡歌', age=22}
Person{name='李連杰', age=56}

public E last():獲取最後的值

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",18);
        set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",16));
        set.add(new Person("李連杰",56));


        System.out.println("set:"+set);
        System.out.println("獲取最後的值:"+set.last());
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='周星馳', age=16}, Person{name='古天樂', age=18}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
獲取最後的值:Person{name='李連杰', age=56}

 

public E lower(E e):返回嚴格小於給定鍵值的最大鍵值

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",18);
        set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",18));
        set.add(new Person("李連杰",56));


        System.out.println("set:"+set);
        System.out.println("獲取"+set.lower(person));
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='古天樂', age=18}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
獲取最後的值:Person{name='劉亦菲', age=11}

public E pollFirst():獲取第一個值並移除第一個值

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",18);
        set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",18));
        set.add(new Person("李連杰",56));


        System.out.println("set:"+set);
        System.out.println("獲取第一個值並移除這個值"+set.pollFirst());
        System.out.println("set:"+set);
    }
}

結果:

set:[Person{name='劉亦菲', age=11}, Person{name='古天樂', age=18}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
獲取第一個值並移除這個值Person{name='劉亦菲', age=11}
set:[Person{name='古天樂', age=18}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]

 

public E pollLast():獲取最後值並移除這個值

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",18);
        set.add(person);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",18));
        set.add(new Person("李連杰",56));


        System.out.println("set:"+set);
        System.out.println("獲取最後值並移除這個值"+set.pollLast());
        System.out.println("set:"+set);
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='古天樂', age=18}, Person{name='胡歌', age=22}, Person{name='李連杰', age=56}]
獲取最後值並移除這個值Person{name='李連杰', age=56}
set:[Person{name='劉亦菲', age=11}, Person{name='古天樂', age=18}, Person{name='胡歌', age=22}]

public boolean remove(Object o):移除元素

public int size() :當前set容量

public Spliterator<E> spliterator() : 方法用於拆分set元素,並逐個迭代它們。

demo:鏈接

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",23);
        Person person2 = new Person("楊超越",18);
        set.add(person);
        set.add(person2);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",18));
        set.add(new Person("李連杰",56));


        System.out.println("set:"+set);
        Spliterator<Person> spliterator = (Spliterator<Person>) set.spliterator();
        spliterator.forEachRemaining(System.out::println);
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='楊超越', age=18}, Person{name='胡歌', age=22}, Person{name='古天樂', age=23}, Person{name='李連杰', age=56}]
Person{name='劉亦菲', age=11}
Person{name='楊超越', age=18}
Person{name='胡歌', age=22}
Person{name='古天樂', age=23}
Person{name='李連杰', age=56}

 

public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement,   boolean toInclusive):返回from到to之間的值,fromInclusive和toInclusive代表是否包含當前值

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",23);
        Person person2 = new Person("楊超越",18);
        set.add(person);
        set.add(person2);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",18));
        set.add(new Person("李連杰",56));


        System.out.println("set:"+set);
        System.out.println("返回age在18-23之間的值"+set.subSet(person2,true,person,true));
    }
}

結果:

set:[Person{name='劉亦菲', age=11}, Person{name='楊超越', age=18}, Person{name='胡歌', age=22}, Person{name='古天樂', age=23}, Person{name='李連杰', age=56}]
返回age在18-23之間的值[Person{name='楊超越', age=18}, Person{name='胡歌', age=22}, Person{name='古天樂', age=23}]

 

public SortedSet<E> subSet(E fromElement, E toElement):返回from到to之間的值,包含from,不包含to,即【左閉右開)

public SortedSet<E> tailSet(E fromElement):返回>=fromElement值的集合元素

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",23);
        Person person2 = new Person("楊超越",18);
        set.add(person);
        set.add(person2);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",18));
        set.add(new Person("李連杰",56));


        System.out.println("set:"+set);
        System.out.println("返回age在18-23之間的值"+set.tailSet(person2));
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='楊超越', age=18}, Person{name='胡歌', age=22}, Person{name='古天樂', age=23}, Person{name='李連杰', age=56}]
返回age在18-23之間的值[Person{name='楊超越', age=18}, Person{name='胡歌', age=22}, Person{name='古天樂', age=23}, Person{name='李連杰', age=56}]

public NavigableSet<E> tailSet(E fromElement, boolean inclusive)返回>=fromElement值的集合元素,inclusive=true包含自身,=false就不包含

demo

public class Test {
    public static void main(String[] args) {
        TreeSet set = new TreeSet();
        Person person = new Person("古天樂",23);
        Person person2 = new Person("楊超越",18);
        set.add(person);
        set.add(person2);
        set.add(new Person("胡歌",22));
        set.add(new Person("劉亦菲",11));
        set.add(new Person("周星馳",18));
        set.add(new Person("李連杰",56));


        System.out.println("set:"+set);
        System.out.println("返回age在18-23之間的值"+set.tailSet(person2,false));
    }
}

結果

set:[Person{name='劉亦菲', age=11}, Person{name='楊超越', age=18}, Person{name='胡歌', age=22}, Person{name='古天樂', age=23}, Person{name='李連杰', age=56}]
返回age在18-23之間的值[Person{name='胡歌', age=22}, Person{name='古天樂', age=23}, Person{name='李連杰', age=56}]

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章