黑马程序员技术交流社区
标题:
在集合中,TreeSet是如何实现有序存放的呢?
[打印本页]
作者:
于汝国
时间:
2011-12-21 12:43
标题:
在集合中,TreeSet是如何实现有序存放的呢?
本帖最后由 于汝国 于 2011-12-21 16:09 编辑
在集合中,HashSet是散列存放的,而TreeSet是有序存放的,那么TreeSet是如何实现有序存放的呢?
作者:
海中的游弋草
时间:
2011-12-21 12:53
TreeSet实现了Set接口,该接口有TreeMap示例支持,此类保证排序后的set按照升序排列元素,根据使用的构造不同方法,可能会按照元素的自然排序进行排序,或按照在创建SEt 时所提供的比较器进行排序。
TreeSet是一个有序集合,元素中安升序排序,缺省是按照自然顺序排序,意味着TreeSet中元素要实现Comparable接口;
作者:
王冀
时间:
2011-12-21 13:10
本帖最后由 王冀 于 2011-12-21 13:12 编辑
TreeSet类内部使用了一个TreeMap对象。其中使用了二叉排序树的结构。
插入新节点的方法如下:
public V put(K key, V value) {
Entry<K,V> t = root;
if (t == null) { //如果不存在根节点则创建一个
root = new Entry<K,V>(key, value, null);
size = 1;
modCount++;
return null;
}
int cmp;
Entry<K,V> parent;
Comparator<? super K> cpr = comparator;
if (cpr != null) { //判断有没有比较器。
do { //从根开始向下查找插入的位置(直到叶节点)
parent = t;
cmp = cpr.compare(key, t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
else {
if (key == null)
throw new NullPointerException();
Comparable<? super K> k = (Comparable<? super K>) key;
do {
parent = t;
cmp = k.compareTo(t.key);
if (cmp < 0)
t = t.left;
else if (cmp > 0)
t = t.right;
else
return t.setValue(value);
} while (t != null);
}
Entry<K,V> e = new Entry<K,V>(key, value, parent); //插入新节点。
if (cmp < 0)
parent.left = e;
else
parent.right = e;
fixAfterInsertion(e);
size++;
modCount++;
return null;
}
复制代码
作者:
于汝国
时间:
2011-12-21 16:08
虽然不是很明白,但同样感谢各位!谢谢!
作者:
刘基军
时间:
2011-12-21 16:48
TreeSet,默认是自然排序,底层数据结构是二叉树。
毕向东老师的视频对应部分有讲,如何排序及二叉树,建议看一下。
作者:
奔→跑
时间:
2011-12-21 22:43
TreeSet,默认是自然排序,底层数据结构是二叉树。
需要实现comparable接口。
和覆盖CompareTo()方法;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2