Java集合(6)——TreeSet

it2026-09-28  11

TreeSet

如果元素具备自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。

public class Demo1 { public static void main(String[] args) { TreeSet tree1 = new TreeSet(); tree1.add(1); tree1.add(10); tree1.add(7); tree1.add(19); tree1.add(9); System.out.println("tree1:"+tree1); TreeSet tree2 = new TreeSet(); tree2.add('b'); tree2.add('f'); tree2.add('a'); tree2.add('c'); System.out.println("tree2:"+tree2); } }

TreeSet的实现原理:

当三个结点不能形成分支的时候,应当调整,类似二叉平衡书,每个结点的左右分支之差不能大于1()见下图: set.add(new Emp(110,“老陆”,100)); set.add(new Emp(113,“老汤”,300)); set.add(new Emp(128,“老蔡”,350)); set.add(new Emp(188,“老张”,400));

treeset添加自定义元素: treeset要注意的事项: 1、往treeset添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。 2、往treeset添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素 的比较规则定义在compareto(T o)方法中。 3、如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加(在TreeMap中如果重复,就只取代值)。(注意:TreeSet与HashCode、equals方法是没有任何关系的) 4、往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。

(1)实现Comparable接口:

package TreeSet; import java.util.TreeSet; /** * treeset添加自定义元素: * * treeset要注意的事项: * 1、往treeset添加元素的时候,如果元素本身具备了自然顺序的特性,那么就按照元素自然顺序的特性进行排序存储。 * 2、网treeset添加元素的时候,如果元素本身不具备自然顺序的特性,那么该元素所属的类必须要实现Comparable接口,把元素 * 的比较规则定义在compareto(T o)方法中。 * 3、如果比较元素的时候,compareTo方法返回的是0,那么该元素就被视为重复元素,不允许添加。(注意:TreeSet与HashCode、equals方法是没有任何关系的) * 4、往TreeSet添加元素的时候,如果元素本身没有具备自然顺序的特性,而元素所属的类也没有实现Comparable接口,那么必须要在创建TreeSet的时候传入一个比较器。 * 5、往TreeSet添加元素的时候,如果元素本身不具备自然顺序的特性,而元素所属的类已经实现了Comparable接口,在创建TreeSet对象的时候也传入了比较器,那么是 * 以比较器的比较规则优先使用。 * 如何自定义定义比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在Compare方法内即可。 * 自定义比价器的格式: * class 类名 implements Comparator{ * public int compare(Object o1,Object O2){ * }* } * Comparator comparator = new Comparator(); * TreeSet tree = new TreeSet(comparator);//带参的构造方法,传入比较器对象 * 推荐使用:比较器(Comparator):更好的提高代码复用性 */ public class Demo2 { public static void main(String[] args){ TreeSet set = new TreeSet(); set.add(new Emp(113, "老钟", 200)); set.add(new Emp(110, "老路", 100)); set.add(new Emp(113, "老唐", 300)); set.add(new Emp(113, "老菜", 500)); set.add(new Emp(114, "老蔡", 500)); //添加失败 set.add(new Emp(115, "老杨", 350)); System.out.println("集合的元素(没有老蔡):"+set); } } class Emp implements Comparable{ int id; String name; int salary; public Emp(int id, String name, int salary){ this.id = id; this.name = name; this.salary = salary; } public String toString(){ return "{编号:" + this.id + " 姓名:" + this.name + " 薪水:" + this.salary + "}"; } //负整数,零或正整数,根据此对象是小于,等于还是大于指定对象。 public int compareTo(Object obj){ Emp e = (Emp)obj; System.out.println(this.name+"compare"+e.name); return this.salary - e.salary; //升序 } }

(2)传入比较器

package TreeSet; import java.util.Comparator; import java.util.TreeSet; public class Demo3 { public static void main(String[] args){ //创建一个比较器对象 MyComparator comparator = new MyComparator(); //创建TreeSet的时候传入比较器 TreeSet set = new TreeSet(comparator); set.add(new Person(1, "小杨")); set.add(new Person(2, "小张")); set.add(new Person(1, "小李")); //添加失败 set.add(new Person(6, "小孙")); System.out.println("集合的元素:"+set); } } class Person{ int id; String name; public Person(int id, String name){ this.id = id; this.name = name; } public String toString(){ return "{编号:" + this.id + " 姓名:" + this.name + "}"; } } class MyComparator implements Comparator{ //根据第一个参数小于,等于或者大于第二个参数分别返回负整数,零或正整数。 public int compare(Object obj1, Object obj2){ //返回的如果是0,则视为重复元素,添加失败。 Person p1 = (Person)obj1; Person p2 = (Person)obj2; return p1.id - p2.id; } }

如何自定义定义比较器:自定义一个类实现Comparator接口即可,把元素与元素之间的比较规则定义在Compare方法内即可。 自定义比价器的格式: class 类名 implements Comparator{ public int compare(Object o1,Object O2){ } } Comparator comparator = new Comparator(); TreeSet tree = new TreeSet(comparator);//带参的构造方法,传入比较器对象 推荐使用:比较器(Comparator)

TreeSet是可以对字符串进行排序的,因为字符串已经实现了Comparable接口。 字符串的比较规则: 情况一:对应位置有不同的字符出现,比较的就是对应位置上的字符。 情况二:对应位置上的字符都一样,比较的就是字符串的长度。

public class Demo3 { public static void main(String[] args) { TreeSet tree = new TreeSet(); tree.add("abccccccc"); tree.add("abw"); tree.add("ab"); //可以添加成功, 因为字符串String类已经实现了Comparable这个接口 System.out.println(tree); } }

练习:

需求:将字符串中的数值进行排序 如:String str = “8 10 15 5 2 7”---->“2 5 7 8 10 15”

package TreeSet; import java.util.Iterator; import java.util.TreeSet; /** * 需求:将字符串中的数值进行排序 * 如:String str = "8 10 15 5 2 7"---->"2 5 7 8 10 15" */ public class Demo5 { public static void main(String[] args){ String str = "8 10 15 5 2 7"; String[] arr = str.split(" "); TreeSet<Integer> set = new TreeSet<Integer>(); int len = arr.length; for(int i=0; i<len; i++){ set.add(Integer.valueOf(arr[i])); //数字字符串转换为整数(用Integer.parseInt()也可以) } Iterator it = set.iterator(); while(it.hasNext()){ System.out.print(it.next()+" "); } } }
最新回复(0)