`

关于TreeSet添加元素后删除

阅读更多

    知道TreeSet的backing map是TreeMap,看程序:

import java.util.TreeSet;

class R implements Comparable<Object> {
	int count;

	public R(int count) {
		this.count = count;

	}

	public String toString() {
		return "R(count:" + count + ")";

	}

	public boolean equals(Object o) {
		if (o instanceof R) {
			R r = (R) o;
			if (this.count == r.count)
				return true;
		}
		return false;
	}

	public int compareTo(Object o) {
		R r = (R) o;
		if (this.count > r.count)
			return 1;
		else if (this.count == r.count)
			return 0;
		else
			return -1;
	}
}

public class TestTreeSetError {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		TreeSet<R> ts = new TreeSet<R>();
		ts.add(new R(5));
		ts.add(new R(-3));
		ts.add(new R(9));
		ts.add(new R(-2));
		System.out.println("1 = " + ts);
		R first = (R) ts.first();
		first.count = 20;
		System.out.println("2 = " + ts);
		R last = (R) ts.last();
		last.count = -2;
		System.out.println("3 = " + ts);
		System.out.println(ts.remove(new R(-2)));
		System.out.println(ts);
		System.out.println(ts.remove(new R(5)));
		System.out.println(ts);
		System.out.println(ts.remove(new R(-2)));
		System.out.println(ts);

	}
}

 

树添加修改稳定之后,形成的红黑树是这样的:

          5

20              -2
      -2

第二层-2是20的右子节点,因为删除时循根搜索,-2一直往左路搜,最后搜到20左子节点为空,所以删除失败,待5删除之后,重新平衡了树结构:

     -2

20      -2

因此-2就能被删除

 

这其中涉及到了TreeSet中的remove:

public boolean remove(Object o) {
    return m.remove(o)==PRESENT;
}

 

TreeMap中的remove:

public V remove(Object key) {
        Entry<K,V> p = getEntry(key);
        if (p == null)
            return null;

        V oldValue = p.value;
        deleteEntry(p);
        return oldValue;
}

 

最终到TreeMap的getEntry:

final Entry<K,V> getEntry(Object key) {
        // Offload comparator-based version for sake of performance
        if (comparator != null)
            return getEntryUsingComparator(key);
        if (key == null)
            throw new NullPointerException();
	Comparable<? super K> k = (Comparable<? super K>) key;
        Entry<K,V> p = root;
        while (p != null) {
            int cmp = k.compareTo(p.key);
            if (cmp < 0)
                p = p.left;
            else if (cmp > 0)
                p = p.right;
            else
                return p;
        }
        return null;
}
 

  添加时涉及到代码略

分享到:
评论

相关推荐

    TreeSet 红黑树结构算法

    例如,TreeSet 的 addAll 方法就是调用 TreeMap 的 putAll 方法来添加元素。TreeSet 的其他方法,如 contains、remove、size 等,也都是调用 TreeMap 的对应方法来实现。 红黑树数据结构是 TreeSet 的核心,它是一...

    TreeSet判断重复元素解析及代码示例

    当向`TreeSet`添加元素时,如果两个元素的`compareTo()`返回值为0,那么`TreeSet`会认为这两个元素是相等的,因此不会添加重复元素。 在给定的代码示例中,创建了一个自定义类`Combine`,实现了`Comparable...

    java 集合框架(TreeSet练习)

    3. **基本操作**:`add()`用于向`TreeSet`中添加元素,`remove()`用于删除指定元素,`contains()`用于检查集合是否包含某个元素。`clear()`则可以清空整个集合。 4. **迭代器**:`TreeSet`遵循Java集合框架的迭代...

    java集合-TreeSet的使用

    如果将重复元素添加到 TreeSet 中,后面的重复元素将被忽略。 支持范围操作:TreeSet 提供了一些方法用于执行范围操作,例如 subSet()、headSet()、tailSet() 等,可以根据元素的顺序提取子集。 效率较高:基于...

    用java的TreeSet写的一个求并集算法

    2. **填充数据**:向这两个`TreeSet`中添加元素,这可以根据具体需求动态添加或从其他数据源读取。 ```java set1.add(1); set1.add(3); set1.add(5); set2.add(2); set2.add(3); set2.add(7); ``` 3. **...

    treeset 和 hashlist 实现的扑克牌游戏

    当需要进行洗牌操作时,可以先将`TreeSet`的元素复制到`ArrayList`,然后对`ArrayList`进行随机排序,最后再将`ArrayList`中的元素重新添加回`TreeSet`。 总之,在选择数据结构实现扑克牌游戏时,应充分考虑数据的...

    HashMap源码实现红黑树添加元素和删除元素

    HashMap 源码实现红黑树添加元素和删除元素 HashMap 中使用红黑树来存储元素,是为了提高查找、插入和删除操作的性能。红黑树是一种自平衡二叉树,可以保持二叉树的平衡,从而获得较高的查找性能。 红黑树的创建...

    treemap treeset hashset hashmap 简要介绍

    对于`TreeSet`,虽然尝试添加了多个相同的`Student`对象,但由于`TreeSet`不允许重复元素,最终集合中只会保留一个元素。对于`HashMap`,尽管`Student`类的`equals()`和`hashCode()`方法未正确实现,但是由于`...

    (TreeSet) s.subSet(608, true, 611, true)

    6. **效率和性能**:由于红黑树的特性,subSet()操作通常非常高效,但添加或删除元素可能会影响子集的性能,因为需要维护红黑树的平衡。 7. **并发考虑**:如果在多线程环境中使用TreeSet,需要使用...

    学生成绩排序(TreeSet方式实现)

    接下来,我们可以创建一个`TreeSet&lt;Student&gt;`实例,添加学生对象,然后遍历`TreeSet`来获取排序后的学生成绩: ```java TreeSet&lt;Student&gt; set = new TreeSet(); set.add(new Student("张三", 90)); set.add(new ...

    HashSet和TreeSet.doc

    在添加元素时,如果两个对象的 `hashCode()` 返回相同的值,那么它们会被放在同一个桶(bucket)中,此时 `equals()` 方法会用来区分这两个元素是否真的相同,以避免添加重复元素。由于 HashSet 的迭代顺序不是固定...

    浅谈Java中几个常用集合添加元素的效率

    在不考虑去重和排序的情况下,ArrayList、LinkedList 和 HashMap 的添加元素效率最高,HashSet 的添加元素效率相对较低,而 TreeSet 的添加元素效率是最低的。在实际开发中,需要根据具体情况选择合适的集合类型,以...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    在实际应用中,TreeSet常用于需要保持元素有序的场景,如保存一组排序后的数据,或者在数据库操作中生成有序的主键等。同时,NavigableSet接口的导航功能使得在大量数据中高效地定位元素或子集成为可能,大大增强了...

    解决TreeSet类的排序问题

    当向TreeSet中添加元素时,它会调用这些元素的`compareTo(Object obj)`方法进行比较。这个方法源自`Comparable`接口,任何希望在TreeSet中进行排序的类都应当实现这个接口。在`compareTo()`方法中,需要定义比较规则...

    day18-集合-中(HashSet&TreeSet&比较器).zip

    当我们向`HashSet`中添加元素时,哈希函数会计算元素的哈希值,根据这个值来决定元素在内部存储结构中的位置。然而,如果两个元素的哈希值冲突,`HashSet`会使用链地址法来处理这些冲突。 接着,我们转向`TreeSet`...

    java中treemap和treeset实现红黑树

    TreeSet的 addAll 方法可以将Collection集合中的所有元素添加到Set集合中,並檢查Collection集合中的元素是否符合TreeSet的顺序规则。 TreeMap 和 TreeSet 之间的关系是,TreeSet 使用 TreeMap 来保存Set集合的元素...

    删除定制整型数组中重复元素输出剩余元素

    在Java编程中,处理整型数组并删除其中的重复元素是一项常见的任务。这通常涉及到集合类的使用,比如HashSet或ArrayList,以及基本的数组操作。本文将深入探讨如何实现这个功能,同时提供一种可能的解决方案。 首先...

    java 去除重复元素

    HashSet是一个不允许有重复元素的集合,当我们尝试将一个数组中的所有元素添加到HashSet时,它会自动过滤掉重复元素。例如: ```java Integer[] array = {1, 2, 3, 2, 4, 3, 5}; Set&lt;Integer&gt; set = new HashSet...

    浅谈java中的TreeMap 排序与TreeSet 排序

    当添加元素到 `TreeSet` 中时,它们会根据比较器的规则进行排序。 以下是对 `TreeMap` 和 `TreeSet` 的主要特性的总结: 1. **自动排序**:两者都支持自动排序,无需额外的排序操作。 2. **数据结构**:都基于红黑...

    对于java集合类的一个简单介绍

    ArrayList更善于查找元素,而LinkedList更善于添加和删除元素。 Set接口是Java集合类中另一个基本的接口,提供了基本的添加、删除、检查元素是否存在的方法。HashSet和TreeSet是Set接口的两个常用的实现类。HashSet...

Global site tag (gtag.js) - Google Analytics