目錄
存儲特點:有序,不重複;key不能爲空,value可以爲null(總結一點:凡是有Tree的集合,都是有序的,凡是有Set的就是不重複的)
public TreeSet():底層創建新的TreeMap
public TreeSet(Collection c):通過集合構造TreeSet
public TreeSet(Comparator comparator):自定義比較器的TreeSet
如果Treeset存儲的是對象,可以通過對象實現Comparator,實現自定義對象比較器
public TreeSet(SortedSet s):通過set構造TreeSet
public boolean addAll(Collection c):通過集合添加元素
public E ceiling(E e):返回大於或等於給定鍵值的最小鍵值
public Comparator comparator():用於在此樹映射中維護順序的比較器,如果使用其鍵的自然順序,則爲null
public boolean contains(Object o) :是否包含摸個元素
public Iterator descendingIterator():用於按降序迭代元素。
public E floor(E e):返回小於或等於給定鍵值的最大鍵值
public SortedSet headSet(E toElement):返回key<=toElement集合
public E higher(E e):返回嚴格大於給定鍵值的最小鍵值
public boolean isEmpty():判斷集合是否爲空
public Iterator iterator() :迭代輸出
public E lower(E e):返回嚴格小於給定鍵值的最大鍵值
public E pollFirst():獲取第一個值並移除第一個值
public E pollLast():獲取最後值並移除這個值
public boolean remove(Object o):移除元素
public Spliterator spliterator() : 方法用於拆分set元素,並逐個迭代它們。
public SortedSet subSet(E fromElement, E toElement):返回from到to之間的值,包含from,不包含to,即【左閉右開)
public SortedSet tailSet(E fromElement):返回>=fromElement值的集合元素
存儲特點:有序,不重複;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}]