TreeSet简介
TreeSet 是一个有序的集合,它的作用是提供有序的Set集合。它继承于AbstractSet抽象类,实现了NavigableSet<E>, Cloneable, java.io.Serializable接口。
TreeSet 继承于AbstractSet,所以它是一个Set集合,具有Set的属性和方法。
TreeSet 实现了NavigableSet接口,意味着它支持一系列的导航方法。比如查找与指定目标最匹配项。
TreeSet 实现了Cloneable接口,意味着它能被克隆。
TreeSet 实现了java.io.Serializable接口,意味着它支持序列化。
TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。
TreeSet为基本操作(add、remove 和 contains)提供受保证的 log(n) 时间开销。
另外,TreeSet是非同步的。 它的iterator 方法返回的迭代器是fail-fast的。
boolean add(E object)
boolean addAll(Collection<? extends E> collection)
void clear()
Object clone()
boolean contains(Object object)
E first()
boolean isEmpty()
E last()
E pollFirst()
E pollLast()
E lower(E e)
E floor(E e)
E ceiling(E e)
E higher(E e)
boolean remove(Object object)
int size()
Comparator<? super E> comparator()
Iterator<E> iterator()
Iterator<E> descendingIterator()
SortedSet<E> headSet(E end)
NavigableSet<E> descendingSet()
NavigableSet<E> headSet(E end, boolean endInclusive)
SortedSet<E> subSet(E start, E end)
NavigableSet<E> subSet(E start, boolean startInclusive, E end, boolean endInclusive)
NavigableSet<E> tailSet(E start, boolean startInclusive)
SortedSet<E> tailSet(E start)
自定义比较器排序;
这种方法需要一个新的类实现Comparator<T>接口
重写其中的Compare 方法
TreeSet<String> wifiSet = new TreeSet<String>(new Comparator<String>() { @Override public int compare(String o1, String o2) { JSONObject obj1 = JSON.parseObject(o1); JSONObject obj2 = JSON.parseObject(o2); return obj1.getDouble("distance").compareTo(obj2.getDouble("distance")); } });
然后, 改成函数式编程可以写成:
Set<JSONObject> treeSet = new TreeSet<>((first, second) -> { JSONObject base1 = first.getJSONObject("base"); String[] loc1 = base1.getString("location").split(", * "); JSONObject base2 = second.getJSONObject("base"); String[] loc2 = base2.getString("location").split(", * "); Double d1 = GeoUtils.getDistance(new Point(Double.valueOf(loc1[1]), Double.valueOf(loc1[0])), new Point(lat, lng)); Double d2 = GeoUtils.getDistance(new Point(Double.valueOf(loc2[1]), Double.valueOf(loc2[0])), new Point(lat, lng)); return d1.compareTo(d2); });
Collector接口包含了一系列方法,为实现具体的归约操作(即收集器)提供了范本。Collector接口中实现的许多收集器,例如toList或groupingBy。这也意味着你可以为Collector接口提供自己的实现,从而*创建自定义归约操作。
要开始使用Collector接口,我们先来看看toList的实现方法,这个在日常中使用最频繁的东西其实也简单。
Collector接口定义的5个函数
public interface Collector<T, A, R> { Supplier<A> supplier(); BiConsumer<A, T> accumulator(); BinaryOperator<A> combiner(); Function<A, R> finisher(); Set<Characteristics> characteristics(); }
- T是流中要收集的对象的泛型
- A是累加器的类型,累加器是在收集过程中用于累积部分结果的对象。
- R是收集操作得到的对象(通常但不一定是集合)的类型。
对于toList, 我们收集的对象是T, 累加器是List, 最终收集的结果也是一个List,于是创建ToListCollector如下:
public class ToListCollector<T> implements Collector<T, List<T>, List<T>>