Java集合之TreeSet⾃定义类⽐较器
Java 集合之TreeSet
基于 TreeMap 的 NavigableSet 实现。使⽤元素的⾃然顺序进⾏排序,或者通过在集合创建时提供的 Comparator 进⾏排序,具体取决于使⽤的构造函数。唯⼀,⽆序(没有按照输⼊顺序进⾏输出)⼜有序(按照升序进⾏遍历)。
此实现为基本操作(添加、删除和包含)提供有保证的 log(n) 时间成本。
请注意,如果要正确实现 Set 接⼝,则 set 维护的顺序(⽆论是否提供了显式⽐较器)必须与 equals ⼀致。(请参阅 Comparable 或Comparator 以获取与 equals ⼀致的精确定义。)这是因为 Set 接⼝是根据 equals 操作定义的,但是 TreeSet 实例使⽤它的
compareTo(或 compare)⽅法执⾏所有元素⽐较,因此从 set 的观点来看,此⽅法认为相等的两个元素就是相等的。即使它的顺序与 equals 不⼀致,set 的⾏为是明确定义的;它只是不遵守 Set 接⼝的⼀般约定。
请注意,此实现不是同步的。如果多个线程同时访问⼀个 TreeSet,并且⾄少有⼀个线程修改了 set,则必须在外部进⾏同步。这通常是通过同步⼀些⾃然封装集合的对象来实现的。如果不存在此类对象,则应
使⽤ Collections.synchronizedSortedSet ⽅法“包装”该set。这最好在创建时完成,以防⽌对集合的意外不同步访问:SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
此类的 iterator ⽅法返回的迭代器是快速失败的:如果在迭代器创建后的任何时间修改set,除了通过迭代器⾃⼰的 remove ⽅法以外的任何⽅式,迭代器都会抛出 ConcurrentModificationException。因此,⾯对并发修改,迭代器快速⽽⼲净地失败,⽽不是在未来不确定的时间冒着任意、⾮确定性⾏为的风险。
请注意,⽆法保证迭代器的快速失败⾏为,因为⼀般⽽⾔,在存在⾮同步并发修改的情况下不可能做出任何硬保证。快速失败的迭代器会尽最⼤努⼒抛出 ConcurrentModificationException。因此,编写依赖于此异常的程序的做法是错误的,正确做法是:迭代器的快速失败⾏为应该仅⽤于检测 bug。
TreeSet底层的⼆叉树的遍历是按照升序的结果出现的,这个升序由中序遍历得到。
构造函数
TreeSet()
构造⼀个新的空树集,根据其元素的⾃然顺序进⾏排序。
TreeSet (Collection<? extends E> c)
构造⼀个包含指定collection 元素的新 TreeSet,根据其元素的⾃然顺序进⾏排序。
TreeSet (Comparator<? super E> Comparator)
构造⼀个新的空TreeSet,根据指定的⽐较器进⾏排序。
TreeSet (SortedSet s)
构造⼀个与指定有序 set 具有相同映射关系和相同排序的新 TreeSet。
⽅法
Modifier and Type Method Description
boolean add (E e)如果指定元素尚不存在,则将其添加到此集合中。
boolean addAll (Collection<? extends E> c)将指定 collection 中的所有元素添加到此 set 中。
E ceiling(E e)返回此集合中⼤于或等于给定元素的最⼩元素,如果没有这样的元素,则返回 null。
void clear()从此集合中删除所有元素。
Object clone()返回此 TreeSet 实例的浅表副本。
Object clone()返回此 TreeSet 实例的浅表副本。
Comparator<? super E>comparator()返回⽤于对该集合中的元素进⾏排序的⽐较器,如果该集合使⽤其元素的⾃然排序,则返回
null。
boolean contains (Object o)如果此集合包含指定的元素,则返回 true。
Iterator descendingIterator()以降序返回此集合中元素的迭代器。
NavigableSet descendingSet()返回此集合中包含的元素的逆序视图。
E first()返回当前在此集合中的第⼀个(最低)元素。
E floor (E e)返回该集合中⼩于或等于给定元素的最⼤元素,如果没有这样的元素,则返回 null。SortedSet headSet (E toElement)返回此集合中元素严格⼩于 toElement 的部分的视图。
NavigableSet headSet (E toElement, boolean
inclusive)
返回此集合中元素⼩于(或等于,如果 inclusive 为真)toElement 的部分的视图。
E higher(E e)返回此集合中严格⼤于给定元素的最⼩元素,如果没有这样的元素,则返回 null。boolean isEmpty()如果此集合不包含任何元素,则返回 true。
Iterator iterator()以升序返回此集合中元素的迭代器。
E last()返回当前在此集合中的最后⼀个(最⾼)元素。
E lower (E e)返回此集合中严格⼩于给定元素的最⼤元素,如果没有这样的元素,则返回 null。
E pollFirst()检索并删除第⼀个(最低)元素,如果此集合为空,则返回 null。
E pollLast()检索并删除最后⼀个(最⾼)元素,如果此集合为空,则返回 null。
boolean remove (Object o)如果指定的元素存在,则从该集合中移除该元素。
int size()返回此集合中的元素数(set 的容量)。
Spliterator spliterator()在此集合中的元素上创建⼀个后期绑定和快速失败的 Spliterator。
SortedSet subSet (E fromElement, E toElement)返回此集合中元素范围从 fromElement(含)到 toElement(不含)的部分的视图。SortedSet tailSet (E fromElement)返回此集合中元素⼤于或等于 fromElement 的部分的视图。
NavigableSet tailSet (E fromElement, boolean
inclusive)返回此集合中元素⼤于(或等于,如果 inclusive 为真)fromElement 的部分的视图。
Modifier and Type Method Description
NavigableSet subSet (E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
fromElement- 返回 set 的低端点,fromInclusive- 如果低端点要包含在返回的视图中,则为 true
toElement- 返回 set 的⾼端点,toInclusive - 如果⾼端点要包含在返回的视图中,则为 true
返回此 set 的部分视图,其元素范围从 fromElement 到 toElement。
如果 fromElement 和 toElement 相等,则返回的 set 为空,除⾮ fromExclusive 和 toExclusive 都为 true。
返回的 set 受此 set ⽀持,所以在返回 set 中的更改将反映在此 set 中,反之亦然。返回 set ⽀持此 set ⽀持的所有可选 set 操作。
如果试图在返回 set 的范围之外插⼊元素,则返回的 set 将抛出 IllegalArgumentException。
//创建⼀个整数型TreeSet:
TreeSet<Integer> tsi = new TreeSet<>(); tsi.add(12);
tsi.add(3);
tsi.add(7);
tsi.add(9);
tsi.add(3);
tsi.add(16);
System.out.println(tsi.size()); //5
System.out.println(tsi); //[3, 7, 9, 12, 16]
//创建⼀个String类型TreeSet: TreeSet<String> tss = new TreeSet<>(); tss.add("afyz");实例
整数型String类型
tss.add("afyz");
tss.add("bfyz");
tss.add("afyz");
tss.add("dfyz");
System.out.println(tss.size()); //3
System.out.println(tss); //[afyz, bfyz, dfyz]
⾃定义类
内部⽐较器
⾃定义类可以通过Comparable接⼝⾃主决定存⼊数据时的⽐较内容
public class Student implements Comparable<Student> {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Student o) { //⽐较器,⽐较时仅仅⽐较Age Age()-o.getAge();
}
}
class TestST {
public static void main(String[] args) {
/
/创建⼀个Student类型TreeSet:
TreeSet<Student> ts = new TreeSet<>();
ts.add(new Student(1,"fyz"));
ts.add(new Student(8,"fyz"));
ts.add(new Student(6,"yjk"));
ts.add(new Student(8,"fyz"));
System.out.println(ts.size());
System.out.println(ts);
}
}
外部⽐较器
public class StudentOCT {
public class StudentOCT {
public static void main(String[] args) {
Comparator<Student> scpnt = new SCPN();//利⽤外部⽐较器,必须⾃⼰制定:
// TreeSet<Student> ts = new TreeSet<>(scpnt);//⼀旦指定外部⽐较器,那么就会按照外部⽐较器来⽐较
TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() { //匿名内部类
@Override
public int compare(Student o1, Student o2) {
Name()Name());
}
});//⼀旦指定外部⽐较器,那么就会按照外部⽐较器来⽐较
ts.add(new Student(1,"fyz"));
ts.add(new Student(8,"fyz"));
ts.add(new Student(6,"yjk"));
ts.add(new Student(8,"fyz"));
System.out.println(ts.size()); //2
System.out.println(ts); //[Student{age=1, name='fyz'}, Student{age=6, name='yjk'}]
}
}
class SCPN implements Comparator<Student> { //外部⽐较类
@Override
public int compare(Student o1, Student o2) {
Name()Name());
}equals不等于
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论