• Java学习之集合(TreeSet)


    TreeSet可以对Set集合中的元素进行排序

    判断元素唯一性的方式:就是根据比较方法的返回结果是否为0,是0:就是相同元素,就不会存储

    什么比较方法,先不管它,我们先按照以前学过的集合定义和使用

    一、自定义元素类型

     1 public class Person {
     2 
     3     private String name;
     4     private int age;
     5 
     6     public Person() {
     7     super();
     8     }
     9 
    10     public Person(String name, int age) {
    11     super();
    12     this.name = name;
    13     this.age = age;
    14     }
    15 
    16     public String getName() {
    17     return name;
    18     }
    19 
    20     public void setName(String name) {
    21     this.name = name;
    22     }
    23 
    24     public int getAge() {
    25     return age;
    26     }
    27 
    28     public void setAge(int age) {
    29     this.age = age;
    30     }
    31 
    32     @Override
    33     public int hashCode() {
    34     System.out.println(this + ":-------hashCode");
    35     return this.name.hashCode() + this.age;
    36     }
    37 
    38     @Override
    39     public boolean equals(Object obj) {
    40     System.out.println(this + ":-------equals-------" + obj);
    41     if (!(obj instanceof Person))
    42         throw new ClassCastException("类型不对");
    43     Person person = (Person) obj;
    44     return this.name.equals(person.name) && person.age == this.age;
    45     }
    46 
    47     @Override
    48     public String toString() {
    49 
    50     return this.name + ":" + this.age;
    51     }
    52 }

    二、业务逻辑代码

     1 import java.util.Iterator;
     2 import java.util.TreeSet;
     3 
     4 import cn.marw.common.bean.Person;
     5 
     6 public class TreeSetDemo {
     7 
     8     public static void main(String[] args) {
     9     TreeSet ts = new TreeSet();
    10     
    11     ts.add(new Person("zhangsan", 28));
    12     ts.add(new Person("lisi", 21));
    13     ts.add(new Person("wangwu", 23));
    14     ts.add(new Person("zhaoliu", 29));
    15     ts.add(new Person("zhouqi", 19));
    16     ts.add(new Person("sunba", 30));
    17     
    18     Iterator it = ts.iterator();
    19     
    20     while(it.hasNext()) {
    21         Person p=(Person)it.next();
    22         System.out.println(p.getName()+":"+p.getAge());
    23     }
    24     }
    25 
    26 }

    运行结果:

     错误信息:Exception in thread "main" java.lang.ClassCastException: class cn.marw.common.bean.Person cannot be cast to class java.lang.Comparable 无法将Person转换为Comparable

    首先想到就是修改Person类,这就是TreeSet集合排序的第一种方式(称之为:元素自然顺序):让元素类型具有比较性(实现Comparable接口,覆盖compareTo方法):

     1 public class Person implements Comparable {
     2 
     3     private String name;
     4     private int age;
     5 
     6     public Person() {
     7     super();
     8     }
     9 
    10     public Person(String name, int age) {
    11     super();
    12     this.name = name;
    13     this.age = age;
    14     }
    15 
    16     public String getName() {
    17     return name;
    18     }
    19 
    20     public void setName(String name) {
    21     this.name = name;
    22     }
    23 
    24     public int getAge() {
    25     return age;
    26     }
    27 
    28     public void setAge(int age) {
    29     this.age = age;
    30     }
    31 
    32     @Override
    33     public int hashCode() {
    34     System.out.println(this + ":-------hashCode");
    35     return this.name.hashCode() + this.age;
    36     }
    37 
    38     @Override
    39     public boolean equals(Object obj) {
    40     System.out.println(this + ":-------equals-------" + obj);
    41     if (!(obj instanceof Person))
    42         throw new ClassCastException("类型不对");
    43     Person person = (Person) obj;
    44     return this.name.equals(person.name) && person.age == this.age;
    45     }
    46 
    47     @Override
    48     public String toString() {
    49 
    50     return this.name + ":" + this.age;
    51     }
    52 
    53     @Override
    54     public int compareTo(Object o) {
    55     //定义Person类型的自然顺序为:根据年龄排序,年龄相同在根据名称排序
    56     if(!(o instanceof Person)){
    57         throw new ClassCastException("类型错误");
    58     }
    59     Person p=(Person)o;
    60     int temp=this.age-p.age;
    61     return temp==0?this.name.compareTo(p.name):temp;
    62     }
    63 }

    结果这里没有做年龄相同,姓名不能的数据:

    这种方式虽然解决了问题,我们想想如果我们修改排序方式那不就影响别人的程序了吗。

    第二种方式就来了,让集合具有比较性

    具体做法:

    1、创建一个类实现Comparator接口,并重写compare方法

    2、在实例化TreeSet集合时,把创建的类作为参数传递给TreeSet构造函数

    实现Comparator接口的类代码:

     1 import java.util.Comparator;
     2 
     3 import cn.marw.common.bean.Person;
     4 
     5 public class PersonComparatorByName implements Comparator {
     6 
     7     @Override
     8     public int compare(Object o1, Object o2) {
     9     //只比较name
    10     if(!(o1 instanceof Person)||!(o2 instanceof Person))
    11         throw new ClassCastException("类型错误");
    12     
    13     return ((Person)o1).getName().compareTo(((Person)o2).getName());
    14     }
    15 
    16 }
    View Code

    实例化TreeSet代码

     1 import java.util.Iterator;
     2 import java.util.TreeSet;
     3 
     4 import cn.marw.common.bean.Person;
     5 
     6 public class TreeSetDemo {
     7 
     8     public static void main(String[] args) {
     9     TreeSet ts = new TreeSet(new PersonComparatorByName());
    10     
    11     ts.add(new Person("zhangsan", 28));
    12     ts.add(new Person("lisi", 21));
    13     ts.add(new Person("wangwu", 23));
    14     ts.add(new Person("zhaoliu", 29));
    15     ts.add(new Person("zhouqi", 19));
    16     ts.add(new Person("sunba", 30));
    17     
    18     Iterator it = ts.iterator();
    19     
    20     while(it.hasNext()) {
    21         Person p=(Person)it.next();
    22         System.out.println(p.getName()+":"+p.getAge());
    23     }
    24     }
    25 }

    结果:

  • 相关阅读:
    利用NewID()生成随机数
    ie下取得iframe里面内容
    [转]linux下动态库安装问题
    【转】基于OpenCV的人脸识别设计方案
    [转]Vim中的记录功能
    [转]opencv中facedetect例子浅析
    [转]vc中 error LNK2001:unresolved external symbol _WinMain@16的解决方法
    转VS2010解决方案转换到VS2008
    JavaScript面向对象程序设计(8): 优雅的封装还是执行的效率?
    用DLL生成LIB文件
  • 原文地址:https://www.cnblogs.com/WarBlog/p/12102449.html
Copyright © 2020-2023  润新知