首页 > 代码库 > TreeSet集合
TreeSet集合
TreeSet集合的特点:
两种排序方式:
方式一:让集合中的元素自身具有比较性,这就让加入到TreeSet集合中的对象必须实现comparable接口重写compareTo(Object obj)方法
这种方式也成为元素的自然排序或默认排序。(但是如果排序的元素不是本人写的,别人写的没有实现comparable接口时想排序使用第二种方式)
方式二:让集合容器具有比较性,自定义一个比较器实现comparator接口,重写compare(Object o1,Object o2)方法,在初始化TreeSet容器对象将这个
自定义的比较器作参数传给容器的构造函数,使得集合容器具有比较性,使用这种方式的优先级高于方式一,
方式一实例:
1 package com.collection; 2 3 import java.util.Iterator; 4 import java.util.TreeSet; 5 6 public class TreeSetTest { 7 8 public static void main(String[] args) { 9 TreeSet<Person> treeSet = new TreeSet<Person>();10 treeSet.add(new Person("zhangsan", 12));11 treeSet.add(new Person("zhangsan", 16));12 treeSet.add(new Person("lisi", 16));13 treeSet.add(new Person("wangwu", 20));14 treeSet.add(new Person("ada", 20));15 Iterator<Person> it = treeSet.iterator();16 while(it.hasNext()){17 Person p = it.next();18 System.out.println(p.toString());19 }20 }21 }22 23 //集合元素实现comparable接口 重写compareTo()方法24 class Person implements Comparable<Person>{25 26 private String name;27 private int age;28 29 public Person(String name, int age) {30 super();31 this.name = name;32 this.age = age;33 }34 public String getName() {35 return name;36 }37 public void setName(String name) {38 this.name = name;39 }40 public int getAge() {41 return age;42 }43 public void setAge(int age) {44 this.age = age;45 }46 47 @Override48 public int compareTo(Person o) {49 int result = this.name.compareTo(o.getName());50 if(result == 0){51 return Integer.valueOf(age).compareTo(new Integer(o.getAge()));52 }53 return result;54 }55 56 @Override57 public String toString() {58 return this.name+"---"+this.age;59 }60 61 }
方式二实例:
1 package com.collection; 2 3 import java.util.Collections; 4 import java.util.Comparator; 5 import java.util.Iterator; 6 import java.util.TreeSet; 7 8 public class TreeSetTest { 9 10 public static void main(String[] args) {11 //用Collections.reverseOrder()将比较结果反排列12 TreeSet<Person> treeSet = new TreeSet<Person>(Collections.reverseOrder(new MyComparator()));13 treeSet.add(new Person("zhangsan", 12));14 treeSet.add(new Person("zhangsan", 16));15 treeSet.add(new Person("lisi", 16));16 treeSet.add(new Person("wangwu", 20));17 treeSet.add(new Person("ada", 20));18 Iterator<Person> it = treeSet.iterator();19 while(it.hasNext()){20 Person p = it.next();21 System.out.println(p.toString());22 }23 }24 }25 26 class MyComparator implements Comparator<Person>{27 28 @Override29 public int compare(Person o1, Person o2) {30 int result = o1.getName().compareTo(o2.getName());31 if(result == 0){32 return new Integer(o1.getAge()).compareTo(new Integer(o2.getAge()));33 }34 return result;35 }36 37 }38 39 //集合元素实现comparable接口 重写compareTo()方法40 class Person implements Comparable<Person>{41 42 private String name;43 private int age;44 45 public Person(String name, int age) {46 super();47 this.name = name;48 this.age = age;49 }50 public String getName() {51 return name;52 }53 public void setName(String name) {54 this.name = name;55 }56 public int getAge() {57 return age;58 }59 public void setAge(int age) {60 this.age = age;61 }62 63 @Override64 public int compareTo(Person o) {65 int result = this.name.compareTo(o.getName());66 if(result == 0){67 return Integer.valueOf(age).compareTo(new Integer(o.getAge()));68 }69 return result;70 }71 72 @Override73 public String toString() {74 return this.name+"---"+this.age;75 }76 77 }
排序性:加入到TreeSet集合中的对象必须具有比较性,也就是对象事项comparable接口覆盖compareTo(Object obj)方法,
判断集合中元素是否相同的标准就是compareTo()中返回值是不是return 0;
如果只加入一个对象到TreeSet中,无需比 该对象不实现comparable接口也不抱错 但这样就没有意义了
底层结构:二叉树,由于TreeSet集合底层结构是二叉树,那么compareTo()中返回值return 1时就会按照插入顺序排序,
相反 return -1,就会按插入的顺序凡序
1 class MyComparator implements Comparator<Person>{ 2 3 @Override 4 public int compare(Person o1, Person o2) { 5 6 return 1; 7 //结果 8 /*zhangsan---12 9 zhangsan---1610 lisi---1611 wangwu---2012 ada---20*/13 }14 15 }
唯一性条件:compareTO() return 0;如果相同,则元素不会被加入到集合中....
TreeSet集合
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。