- java.lang.Object
-
- java.util.AbstractCollection<E>
-
- java.util.AbstractSet<E>
-
- java.util.TreeSet<E>
-
- 参数类型
-
E
- 此集维护的元素类型
- 实现的所有接口
-
Serializable
,Cloneable
,Iterable<E>
,Collection<E>
,NavigableSet<E>
,Set<E>
,SortedSet<E>
public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, Serializable
一个NavigableSet
实现基于一个TreeMap
。 的元件使用其有序natural ordering ,或由Comparator
集合创建时提供,这取决于所使用的构造方法。此实现提供了基本的操作(保证的log(n)时间成本
add
,remove
和contains
)。请注意,如果要正确实现
Set
接口,则由集合维护的排序(无论是否提供显式比较器)必须与equals一致 。 (有关与equals一致的精确定义,请参阅Comparable
或Comparator
)这是因为Set
接口是根据equals
操作定义的,但是TreeSet
实例使用其compareTo
(或compare
)方法执行所有元素比较,因此从该集合的角度来看,通过这种方法被认为相等的元素是相等的。 一套的行为是明确的,即使它的排序和equals不一致; 它只是没有遵守Set
接口的一般合同。请注意,此实现不同步。 如果多个线程同时访问树集,并且至少有一个线程修改了该集,则必须在外部进行同步。 这通常通过在自然封装集合的某个对象上进行同步来实现。 如果不存在此类对象,则应使用
Collections.synchronizedSortedSet
方法“包装”该集合 。 这最好在创建时完成,以防止对集合的意外不同步访问:SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));
此类的
iterator
方法返回的迭代器是快速失败的 :如果在创建迭代器之后的任何时间修改集合,除了通过迭代器自己的remove
方法之外,迭代器将抛出ConcurrentModificationException
。 因此,在并发修改的情况下,迭代器快速而干净地失败,而不是在未来的未确定时间冒任意,非确定性行为的风险。请注意,迭代器的快速失败行为无法得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬性保证。 失败快速迭代器在尽力而为的基础上抛出
ConcurrentModificationException
。 因此,编写依赖于此异常的程序以确保其正确性是错误的: 迭代器的快速失败行为应该仅用于检测错误。此类是Java Collections Framework的成员。
- 从以下版本开始:
- 1.2
- 另请参见:
-
Collection
,Set
,HashSet
,Comparable
,Comparator
,TreeMap
, Serialized Form
-
-
构造方法摘要
构造方法 构造器 描述 TreeSet()
构造一个新的空树集,根据其元素的自然顺序进行排序。TreeSet(Collection<? extends E> c)
构造一个新的树集,其中包含指定集合中的元素,并根据其元素的 自然顺序进行排序 。TreeSet(Comparator<? super E> comparator)
构造一个新的空树集,根据指定的比较器进行排序。TreeSet(SortedSet<E> s)
构造一个包含相同元素并使用与指定有序集相同排序的新树集。
-
方法摘要
所有方法 实例方法 具体的方法 变量和类型 方法 描述 boolean
add(E e)
如果指定的元素尚不存在,则将其添加到此集合中。boolean
addAll(Collection<? extends E> c)
将指定集合中的所有元素添加到此集合中。E
ceiling(E e)
返回此set中大于或等于给定元素的null
元素,如果没有这样的元素,则null
。void
clear()
从该集中删除所有元素。Object
clone()
返回此TreeSet
实例的浅表副本。boolean
contains(Object o)
如果此set包含指定的元素,则返回true
。Iterator<E>
descendingIterator()
以降序返回此集合中元素的迭代器。NavigableSet<E>
descendingSet()
返回此set中包含的元素的逆序视图。E
first()
返回此集合中当前的第一个(最低)元素。E
floor(E e)
返回此set中小于或等于给定元素的最大元素,如果没有这样的元素,则null
。SortedSet<E>
headSet(E toElement)
返回此set的部分视图,其元素严格小于toElement
。NavigableSet<E>
headSet(E toElement, boolean inclusive)
返回此set的部分视图,其元素小于(或等于,如果inclusive
为true)toElement
。E
higher(E e)
返回此集合中的最小元素严格大于给定元素,如果没有这样的元素,则null
。boolean
isEmpty()
如果此集合不包含任何元素,则返回true
。Iterator<E>
iterator()
以升序返回此集合中元素的迭代器。E
last()
返回此集合中当前的最后一个(最高)元素。E
lower(E e)
返回此集合中的最大元素严格小于给定元素,如果没有这样的元素,则null
。E
pollFirst()
检索并删除第一个(最低)元素,如果此组为空,则返回null
。E
pollLast()
检索并删除最后一个(最高)元素,如果此集合为空,则返回null
。boolean
remove(Object o)
如果存在,则从该集合中移除指定的元素。int
size()
返回此集合中的元素数(基数)。Spliterator<E>
spliterator()
在此集合中的元素上创建late-binding和故障快速Spliterator
。NavigableSet<E>
subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
返回此set的部分视图,其元素范围为fromElement
到toElement
。SortedSet<E>
subSet(E fromElement, E toElement)
返回此set的部分视图,其元素范围从fromElement
(含)到toElement
(独占)。SortedSet<E>
tailSet(E fromElement)
返回此set的部分视图,其元素大于或等于fromElement
。NavigableSet<E>
tailSet(E fromElement, boolean inclusive)
返回此set的部分视图,其元素大于(或等于,如果inclusive
为true)fromElement
。-
声明方法的类 java.util.AbstractSet
equals, hashCode, removeAll
-
声明方法的类 java.util.AbstractCollection
containsAll, retainAll, toArray, toArray, toString
-
声明方法的接口 java.util.Collection
parallelStream, removeIf, stream, toArray
-
声明方法的接口 java.util.SortedSet
comparator
-
-
-
-
构造方法详细信息
-
TreeSet
public TreeSet()
构造一个新的空树集,根据其元素的自然顺序进行排序。 插入集合中的所有元素都必须实现Comparable
接口。 此外,所有这些元素必须是可相互比较的 :e1.compareTo(e2)
不得为ClassCastException
中的任何元素e1
和e2
抛出ClassCastException
。 如果用户尝试向违反此约束的集合添加元素(例如,用户尝试将字符串元素添加到其元素为整数的集合),则add
调用将抛出ClassCastException
。
-
TreeSet
public TreeSet(Comparator<? super E> comparator)
构造一个新的空树集,根据指定的比较器进行排序。 插入到集合中的所有元素必须通过指定的比较器相互比较:comparator.compare(e1, e2)
不得为ClassCastException
中的任何元素e1
和e2
抛出ClassCastException
。 如果用户尝试向违反此约束的集合添加元素,则add
调用将抛出ClassCastException
。- 参数
-
comparator
- 将用于订购此集的比较器。 如果是null
,将使用natural ordering的元素。
-
TreeSet
public TreeSet(Collection<? extends E> c)
构造一个新的树集,其中包含指定集合中的元素,并根据其元素的自然顺序进行排序 。 插入集合中的所有元素都必须实现Comparable
接口。 此外,所有这些元素必须是可相互比较的 :e1.compareTo(e2)
不得为ClassCastException
中的任何元素e1
和e2
抛出ClassCastException
。- 参数
-
c
- 其元素将包含新集的集合 - 异常
-
ClassCastException
- 如果c
中的元素不是Comparable
,或者不可相互比较 -
NullPointerException
- 如果指定的集合为null
-
TreeSet
public TreeSet(SortedSet<E> s)
构造一个包含相同元素并使用与指定有序集相同排序的新树集。- 参数
-
s
- 排序集,其元素将包含新集 - 异常
-
NullPointerException
- 如果指定的有序集为空
-
-
方法详细信息
-
iterator
public Iterator<E> iterator()
以升序返回此集合中元素的迭代器。- Specified by:
-
iterator
在界面Collection<E>
- Specified by:
-
iterator
接口Iterable<E>
- Specified by:
-
iterator
在界面NavigableSet<E>
- Specified by:
-
iterator
在界面Set<E>
- Specified by:
-
iterator
,类AbstractCollection<E>
- 结果
- 按升序排列此集合中元素的迭代器
-
descendingIterator
public Iterator<E> descendingIterator()
以降序返回此集合中元素的迭代器。- Specified by:
-
descendingIterator
接口NavigableSet<E>
- 结果
- 这个集合中元素的迭代器按降序排列
- 从以下版本开始:
- 1.6
-
descendingSet
public NavigableSet<E> descendingSet()
从界面复制的说明:NavigableSet
返回此set中包含的元素的逆序视图。 降序集由此集支持,因此对集的更改将反映在降序集中,反之亦然。 如果在任一集上的迭代正在进行时修改了任一集(除了通过迭代器自己的remove
操作),迭代的结果是未定义的。返回的集合的订购量等于
Collections.reverseOrder
(comparator())
。 表达式s.descendingSet().descendingSet()
返回s.descendingSet().descendingSet()
的视图,s
等效于s
。- Specified by:
-
descendingSet
接口NavigableSet<E>
- 结果
- 该集的逆序视图
- 从以下版本开始:
- 1.6
-
size
public int size()
返回此集合中的元素数(基数)。
-
isEmpty
public boolean isEmpty()
如果此集合不包含任何元素,则返回true
。- Specified by:
-
isEmpty
在界面Collection<E>
- Specified by:
-
isEmpty
在界面Set<E>
- 重写:
-
isEmpty
在类AbstractCollection<E>
- 结果
-
true
如果此集合不包含任何元素
-
contains
public boolean contains(Object o)
如果此set包含指定的元素,则返回true
。 更正式地说,返回true
当且仅当此set包含的元素e
,使得Objects.equals(o, e)
。- Specified by:
-
contains
接口Collection<E>
- Specified by:
-
contains
在界面Set<E>
- 重写:
-
contains
类AbstractCollection<E>
- 参数
-
o
- 要在此集中检查包含的对象 - 结果
-
true
如果此set包含指定的元素 - 异常
-
ClassCastException
- 如果指定的对象无法与集合中当前的元素进行比较 -
NullPointerException
- 如果指定的元素为null且此set使用自然排序,或者其比较器不允许null元素
-
add
public boolean add(E e)
如果指定的元素尚不存在,则将其添加到此集合中。 更正式地,如果集合不包含元素e2
例如Objects.equals(e, e2)
,则将指定元素e
添加到此集合。 如果此set已包含该元素,则调用将保持set不变并返回false
。- Specified by:
-
add
接口Collection<E>
- Specified by:
-
add
接口Set<E>
- 重写:
-
add
在类AbstractCollection<E>
- 参数
-
e
- 要添加到此集合的元素 - 结果
-
true
如果此集合尚未包含指定的元素 - 异常
-
ClassCastException
- 如果指定的对象无法与此集合中当前的元素进行比较 -
NullPointerException
- 如果指定的元素为null且此set使用自然排序,或者其比较器不允许null元素
-
remove
public boolean remove(Object o)
如果存在,则从该集合中移除指定的元素。 更正式地,如果此集合包含这样的元素,则删除元素e
,使得Objects.equals(o, e)
。 如果此集合包含元素,则返回true
(或者等效地,如果此集合因调用而更改)。 (一旦调用返回,该集合将不包含该元素。)- Specified by:
-
remove
在界面Collection<E>
- Specified by:
-
remove
在界面Set<E>
- 重写:
-
remove
类AbstractCollection<E>
- 参数
-
o
- 要从此集合中删除的对象(如果存在) - 结果
-
true
如果此set包含指定的元素 - 异常
-
ClassCastException
- 如果指定的对象无法与此集合中当前的元素进行比较 -
NullPointerException
- 如果指定的元素为null并且此set使用自然排序,或者其比较器不允许null元素
-
clear
public void clear()
从该集中删除所有元素。 此调用返回后,该集将为空。- Specified by:
-
clear
在界面Collection<E>
- Specified by:
-
clear
在界面Set<E>
- 重写:
-
clear
类AbstractCollection<E>
-
addAll
public boolean addAll(Collection<? extends E> c)
将指定集合中的所有元素添加到此集合中。- Specified by:
-
addAll
在界面Collection<E>
- Specified by:
-
addAll
在界面Set<E>
- 重写:
-
addAll
,类AbstractCollection<E>
- 参数
-
c
- 包含要添加到此集合的元素的集合 - 结果
-
true
如果此设置因呼叫而更改 - 异常
-
ClassCastException
- 如果提供的元素无法与集合中当前的元素进行比较 -
NullPointerException
- 如果指定的集合为null或者任何元素为null并且此set使用自然排序,或者其比较器不允许null元素 - 另请参见:
-
AbstractCollection.add(Object)
-
subSet
public NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
从界面复制的说明:NavigableSet
返回此set的部分视图,其元素范围为fromElement
至toElement
。 如果fromElement
和toElement
相等,则返回的集合为空,除非fromInclusive
和toInclusive
都为真。 返回的集由此集支持,因此返回集中的更改将反映在此集中,反之亦然。 返回的集支持此集支持的所有可选集操作。返回的集合将尝试在其范围之外插入元素时抛出
IllegalArgumentException
。- Specified by:
-
subSet
在界面NavigableSet<E>
- 参数
-
fromElement
- 返回集的低端点 -
fromInclusive
-true
如果true
低端点包含在返回的视图中 -
toElement
- 返回集的高端点 -
toInclusive
-true
如果true
高端点包含在返回的视图中 - 结果
-
该集合的部分视图,其元素范围从
fromElement
(含),到toElement
,独占 - 异常
-
ClassCastException
- 如果fromElement
和toElement
无法使用此set的比较器相互比较(或者,如果该组没有比较器,则使用自然排序)。 如果无法将fromElement
或toElement
与当前集合中的元素进行比较,则实现可能(但不是必须)抛出此异常。 -
NullPointerException
- 如果fromElement
或toElement
为null且此set使用自然排序,或者其比较器不允许null元素 -
IllegalArgumentException
- 如果fromElement
大于toElement
; 或者如果此设置本身具有受限范围,则fromElement
或toElement
位于范围的范围之外。 - 从以下版本开始:
- 1.6
-
headSet
public NavigableSet<E> headSet(E toElement, boolean inclusive)
从界面复制的说明:NavigableSet
返回此set的部分视图,其元素小于(或等于,如果inclusive
为true)toElement
。 返回的集由此集支持,因此返回集中的更改将反映在此集中,反之亦然。 返回的集支持此集支持的所有可选集操作。返回的集合将尝试在其范围之外插入元素时抛出
IllegalArgumentException
。- Specified by:
-
headSet
接口NavigableSet<E>
- 参数
-
toElement
- 返回集的高端点 -
inclusive
-true
如果true
高端点包含在返回的视图中 - 结果
-
该集合的部分视图,其元素小于(或等于,如果
inclusive
为真)toElement
- 异常
-
ClassCastException
- 如果toElement
与此组的比较器不兼容(或者,如果该组没有比较器,则toElement
未实现Comparable
)。 如果无法将toElement
与当前集合中的元素进行比较,则实现可能(但不是必须)抛出此异常。 -
NullPointerException
- 如果toElement
为null且此set使用自然排序,或者其比较器不允许null元素 -
IllegalArgumentException
- 如果此设置本身具有受限范围,并且toElement
位于范围的范围之外 - 从以下版本开始:
- 1.6
-
tailSet
public NavigableSet<E> tailSet(E fromElement, boolean inclusive)
从界面复制的说明:NavigableSet
返回此set的部分视图,其元素大于(或等于,如果inclusive
为true)fromElement
。 返回的集由此集支持,因此返回集中的更改将反映在此集中,反之亦然。 返回的集支持此集支持的所有可选集操作。返回的集合将尝试在其范围之外插入元素时抛出
IllegalArgumentException
。- Specified by:
-
tailSet
接口NavigableSet<E>
- 参数
-
fromElement
- 返回集的低端点 -
inclusive
-true
如果true
低端点包含在返回的视图中 - 结果
-
该集合的部分视图,其元素大于或等于
fromElement
- 异常
-
ClassCastException
- 如果fromElement
与此组的比较器不兼容(或者,如果该组没有比较器,则fromElement
未实现Comparable
)。 如果无法将fromElement
与当前集合中的元素进行比较,则实现可能(但不是必须)抛出此异常。 -
NullPointerException
- 如果fromElement
为null且此集合使用自然排序,或其比较器不允许null元素 -
IllegalArgumentException
- 如果此设置本身具有受限范围,并且fromElement
位于范围的范围之外 - 从以下版本开始:
- 1.6
-
subSet
public SortedSet<E> subSet(E fromElement, E toElement)
从界面复制的说明:NavigableSet
返回此set的部分视图,其元素范围从fromElement
(含)到toElement
(独占)。 (如果fromElement
和toElement
相等,则返回的集为空。)返回的集由此集支持,因此返回集中的更改将反映在此集中,反之亦然。 返回的集支持此集支持的所有可选集操作。返回的集合将尝试在其范围之外插入元素时抛出
IllegalArgumentException
。相当于
subSet(fromElement, true, toElement, false)
。- Specified by:
-
subSet
在界面NavigableSet<E>
- Specified by:
-
subSet
在界面SortedSet<E>
- 参数
-
fromElement
- 返回集的低端点(包括) -
toElement
- 返回集的高端点(不包括) - 结果
-
此集合的部分视图,其元素范围从
fromElement
(含),到toElement
,独占 - 异常
-
ClassCastException
- 如果fromElement
和toElement
无法使用此组的比较器相互比较(或者,如果该组没有比较器,则使用自然排序)。 如果无法将fromElement
或toElement
与当前集合中的元素进行比较,则实现可能(但不是必须)抛出此异常。 -
NullPointerException
- 如果fromElement
或toElement
为null且此集合使用自然排序,或其比较器不允许null元素 -
IllegalArgumentException
- 如果fromElement
大于toElement
; 或者如果此设置本身具有受限范围,则fromElement
或toElement
位于范围的范围之外
-
headSet
public SortedSet<E> headSet(E toElement)
从界面复制的说明:NavigableSet
返回此set的部分视图,其元素严格小于toElement
。 返回的集由此集支持,因此返回集中的更改将反映在此集中,反之亦然。 返回的集支持此集支持的所有可选集操作。返回的集合将尝试在其范围之外插入元素时抛出
IllegalArgumentException
。相当于
headSet(toElement, false)
。- Specified by:
-
headSet
在界面NavigableSet<E>
- Specified by:
-
headSet
在界面SortedSet<E>
- 参数
-
toElement
- 返回集的高端点(不包括) - 结果
-
该集合的部分视图,其元素严格小于
toElement
- 异常
-
ClassCastException
- 如果toElement
与此组的比较器不兼容(或者,如果该组没有比较器,则toElement
未实现Comparable
)。 如果无法将toElement
与当前集合中的元素进行比较,则实现可能(但不是必须)抛出此异常。 -
NullPointerException
- 如果toElement
为null且此set使用自然排序,或者其比较器不允许null元素 -
IllegalArgumentException
- 如果此设置本身具有受限范围,并且toElement
位于范围的范围之外
-
tailSet
public SortedSet<E> tailSet(E fromElement)
从界面复制的说明:NavigableSet
返回此set的部分视图,其元素大于或等于fromElement
。 返回的集由此集支持,因此返回集中的更改将反映在此集中,反之亦然。 返回的集支持此集支持的所有可选集操作。返回的集合将尝试在其范围之外插入元素时抛出
IllegalArgumentException
。相当于
tailSet(fromElement, true)
。- Specified by:
-
tailSet
在界面NavigableSet<E>
- Specified by:
-
tailSet
在界面SortedSet<E>
- 参数
-
fromElement
- 返回集的低端点(包括) - 结果
-
该集合的部分视图,其元素大于或等于
fromElement
- 异常
-
ClassCastException
- 如果fromElement
与此组的比较器不兼容(或者,如果该组没有比较器,则fromElement
未实现Comparable
)。 如果无法将fromElement
与当前集合中的元素进行比较,则实现可能(但不是必须)抛出此异常。 -
NullPointerException
- 如果fromElement
为null且此set使用自然排序,或者其比较器不允许null元素 -
IllegalArgumentException
- 如果此设置本身具有受限范围,并且fromElement
位于范围的范围之外
-
first
public E first()
从界面复制的说明:SortedSet
返回此集合中当前的第一个(最低)元素。- Specified by:
-
first
在界面SortedSet<E>
- 结果
- 当前在此集合中的第一个(最低)元素
- 异常
-
NoSuchElementException
- 如果此设置为空
-
last
public E last()
从界面复制的说明:SortedSet
返回此集合中当前的最后一个(最高)元素。- Specified by:
-
last
接口SortedSet<E>
- 结果
- 当前在此集合中的最后一个(最高)元素
- 异常
-
NoSuchElementException
- 如果此设置为空
-
lower
public E lower(E e)
从界面复制的说明:NavigableSet
返回此集合中的最大元素严格小于给定元素,如果没有这样的元素,则null
。- Specified by:
-
lower
在界面NavigableSet<E>
- 参数
-
e
- 要匹配的值 - 结果
-
e
元素小于e
,如果没有这样的元素null
- 异常
-
ClassCastException
- 如果指定的元素无法与集合中当前的元素进行比较 -
NullPointerException
- 如果指定的元素为null并且此set使用自然排序,或者其比较器不允许null元素 - 从以下版本开始:
- 1.6
-
floor
public E floor(E e)
从界面复制的说明:NavigableSet
返回此set中小于或等于给定元素的最大元素,如果没有这样的元素,则null
。- Specified by:
-
floor
在界面NavigableSet<E>
- 参数
-
e
- 要匹配的值 - 结果
-
e
元素小于或等于e
,如果没有这样的元素null
- 异常
-
ClassCastException
- 如果指定的元素无法与集合中当前的元素进行比较 -
NullPointerException
- 如果指定的元素为null并且此set使用自然排序,或者其比较器不允许null元素 - 从以下版本开始:
- 1.6
-
ceiling
public E ceiling(E e)
从界面复制的说明:NavigableSet
返回此set中大于或等于给定元素的null
元素,如果没有这样的元素,则null
。- Specified by:
-
ceiling
在界面NavigableSet<E>
- 参数
-
e
- 要匹配的值 - 结果
-
最小元素大于或等于
e
,如果没有这样的元素null
- 异常
-
ClassCastException
- 如果指定的元素无法与集合中当前的元素进行比较 -
NullPointerException
- 如果指定的元素为null且此set使用自然排序,或者其比较器不允许null元素 - 从以下版本开始:
- 1.6
-
higher
public E higher(E e)
从界面复制的说明:NavigableSet
返回此集合中的最小元素严格大于给定元素,如果没有这样的元素,则null
。- Specified by:
-
higher
在界面NavigableSet<E>
- 参数
-
e
- 要匹配的值 - 结果
-
最小元素大于
e
,如果没有这样的元素,null
- 异常
-
ClassCastException
- 如果指定的元素无法与集合中当前的元素进行比较 -
NullPointerException
- 如果指定的元素为null且此set使用自然排序,或者其比较器不允许null元素 - 从以下版本开始:
- 1.6
-
pollFirst
public E pollFirst()
从界面复制的说明:NavigableSet
检索并删除第一个(最低)元素,如果此集合为空,则返回null
。- Specified by:
-
pollFirst
在界面NavigableSet<E>
- 结果
-
第一个元素,如果此组为空,
null
- 从以下版本开始:
- 1.6
-
pollLast
public E pollLast()
从界面复制的说明:NavigableSet
检索并删除最后一个(最高)元素,如果此组为空,则返回null
。- Specified by:
-
pollLast
接口NavigableSet<E>
- 结果
-
最后一个元素,如果此组为空,
null
- 从以下版本开始:
- 1.6
-
clone
public Object clone()
返回此TreeSet
实例的浅表副本。 (元素本身未被克隆。)
-
spliterator
public Spliterator<E> spliterator()
在此集合中的元素上创建late-binding和故障快速Spliterator
。该
Spliterator
报告Spliterator.SIZED
,Spliterator.DISTINCT
,Spliterator.SORTED
和Spliterator.ORDERED
。 覆盖实现应记录其他特征值的报告。该spliterator的比较(见
Spliterator.getComparator()
)是null
,如果树集的比较(见SortedSet.comparator()
)是null
。 否则,分裂器的比较器与树组的比较器相同或强加相同的总排序。- Specified by:
-
spliterator
在界面Collection<E>
- Specified by:
-
spliterator
在界面Iterable<E>
- Specified by:
-
spliterator
接口Set<E>
- Specified by:
-
spliterator
在界面SortedSet<E>
- 结果
-
a
Spliterator
超过此集合中的元素 - 从以下版本开始:
- 1.8
-
-