zl程序教程

您现在的位置是:首页 >  后端

当前栏目

java中TreeSet集合如何实现元素的判重

JAVA集合 实现 如何 元素 TreeSet
2023-09-14 08:57:54 时间
public class TreeSet E extends AbstractSet E implements NavigableSet E , Cloneable, java.io.Serializable private transient NavigableMap E,Object //NavigableMap继承SortedMap, 二者都是接口,在TreeMap中有实现 private static final Object PRESENT = new Object(); TreeSet(NavigableMap E,Object m) { this.m = m; ////第一种构造方法 public TreeSet(Comparator ? super E comparator) { this(new TreeMap (comparator)); ////第二种构造方法 public TreeSet() { this(new TreeMap E,Object .......... public boolean add(E e) { return m.put(e, PRESENT)==null; 再看一下 TreeMap 中是如何实现的 put()函数的 public V put(K key, V value) { Entry K,V t = root; if (t == null) { compare(key, key); // type (and possibly null) check root = new Entry (key, value, null); size = 1; modCount++; return null; int cmp; Entry K,V parent; // split comparator and comparable paths 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 (key, value, parent); if (cmp 0) parent.left = e; else parent.right = e; fixAfterInsertion(e); size++; modCount++; return null; 也就是说TreeSet内部实现使用TreeMap这个类来完成的 TreeSet的内部实现元素之间是否相等? 如果指定了Comparator(也就是利用第一种构造方法), 那么就用其中的compare方法进行比较 否则就用Comparable中的compareTo()方法进行元素的比较 import java.util.*; public class CompTest{ public static void main(String args[]){ Set myClass st = new TreeSet myClass st.add(new myClass(1, "fd")); st.add(new myClass(2, "fff")); st.add(new myClass(2, "tttt")); st.add(new myClass(1, "fd")); for(Iterator myClass it = st.iterator(); it.hasNext();) System.out.println(it.next()); class myClass implements Comparable myClass { public int x; public String name; public myClass(int x, String name){ this.x=x; this.name=name; public int compareTo(myClass tmp){ if(this.x==tmp.x) return this.name.compareTo(tmp.name); else return this.x-tmp.x; public String toString(){ return x+" "+name; }
【Java 数据结构】TreeMap和TreeSet的介绍 TreeMap 和 TreeSet 是Java中利用搜索树实现的 Map 和 Set,它们的底层是红黑树,而红黑树是一棵近似平衡的二叉搜索树,关于红黑树相关知识后续讲解。本期主要是学会 TreeMap 和 TreeSet 的使用,以及知道他们的特点即可。
Java集合学习3:Set集合-TreeSet 基于hashcode计算元素存放位置。 当存入元素的哈希码相同时,会调用equals进行确认,如果为true,则拒绝后者存入。
java集合类史上最细讲解 - TreeSet,TreeMap篇 1.TreeSet概述 TreeSet实现了Set接口,与HashSet不同的时,他是有序集合,底层是一个TreeMap 默认按照升序排列,代码示例:
Java集合详解7:一文搞清楚HashSet,TreeSet与LinkedHashSet的异同 《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始写的新系列。 这些文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star、fork哈 文章首发于我的个人博客: www.how2playlife.com 今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合使用味道更佳。
Java容器深入浅出之HashSet、TreeSet和EnumSet Java集合中的Set接口,定义的是一类无顺序的、不可重复的对象集合。如果尝试添加相同的元素,add()方法会返回false,同时添加失败。Set接口包括3个主要的实现类:HashSet、TreeSet和EnumSet。