Set接口的常用子类(2)

本文介绍Java中TreeSet的基本使用方法,包括如何通过实现Comparable接口来指定元素的排序规则,以及如何解决元素重复的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

13.4.2  Set接口的常用子类(2)

以上程序代码出现了类转换异常,会出现这样的问题,是因为TreeSet中的元素是有序存放,所以对于一个对象必须指定好其排序规则,且TreeSet中的每个对象所在的类都必须实现Comparable接口才可以正常使用。

范例:指定排序规则

  1. package org.lxh.demo13.setdemo;  
  2. import java.util.Set;  
  3. import java.util.TreeSet;  
  4. class Person implements Comparable<Person> {    // 
    定义Person类,实现比较器
     
  5.     private String name;                        // 定义name属性  
  6.     private int age;                            // 定义age属性  
  7.     public Person(String name, int age) {       // 通过构造方法为属性赋值  
  8.         this.name = name;                       // 为name属性赋值  
  9.         this.age = age;                         // 为age属性赋值  
  10.     }  
  11.     public String toString() {                  // 覆写toString()方法  
  12.         return "姓名:" + this.name + ";年龄:" + this.age;  
  13.     }  
  14.     public int compareTo(Person per) {              // 覆写compareTo()方法,  
  15. 指定排序规则  
  16.         if (this.age > per.age) {                   // 通过年龄排序  
  17.             return 1;  
  18.         } else if (this.age < per.age) {  
  19.             return -1;  
  20.         }else{  
  21.             return 0 ;  
  22.         }  
  23.     }  
  24. }  
  25. public class TreeSetDemo03 {  
  26.     public static void main(String[] args) {  
  27.         Set<Person> allSet = new TreeSet<Person>();// 实例化Set接口对象  
  28.         allSet.add(new Person("张三"30));           // 加入元素  
  29.         allSet.add(new Person("李四"31));           // 加入元素  
  30.         allSet.add(new Person("王五"32));           // 加入元素  
  31.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  32.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  33.         allSet.add(new Person("赵六"33));           // 加入元素  
  34.         allSet.add(new Person("孙七"33));       // 年龄重复  
  35.         System.out.println(allSet);                 // 输出集合,调用  
  36. toString()  
  37.     }  

程序运行结果:

  1. [姓名:张三;年龄:30, 姓名:李四;年龄:31
    姓名:王五;年龄:32, 姓名:赵六;年龄:33

从程序的运行结果中可以发现,重复的"王五"对象只有一个了;"赵六"和"孙七"的数据中姓名并不重复,只是年龄重复了,但是"孙七"却没有加入到集合中。这是由于采用了比较器造成的,因为比较器操作时如果某个属性没有进行比较的指定,则也会认为是同一个对象,所以此时应该在Person类的compareTo方法中增加按姓名比较。

范例:修改Person的比较器

  1. package org.lxh.demo13.setdemo;  
  2. import java.util.Set;  
  3. import java.util.TreeSet;  
  4. class Person implements Comparable<Person> {    // 定义Person类,实现比较器  
  5.     private String name;                        // 定义name属性  
  6.     private int age;                            // 定义age属性  
  7.     public Person(String name, int age) {       // 通过构造方法为属性赋值  
  8.         this.name = name;                       // 为name属性赋值  
  9.         this.age = age;                             // 为age属性赋值  
  10.     }  
  11.     public String toString() {                      // 覆写toString()方法  
  12.         return "姓名:" + this.name + ";年龄:" + this.age;  
  13.     }  
  14.     public int compareTo(Person per) {              // 覆写compareTo()方法,  
  15. 指定排序规则  
  16.         if (this.age > per.age) {                   // 通过年龄排序  
  17.             return 1;  
  18.         } else if (this.age < per.age) {  
  19.             return -1;  
  20.         }else{  
  21.             return this.name.compareTo(per.name) ;  // 增加字符串的比较  
  22.         }  
  23.     }  
  24. }  
  25. public class TreeSetDemo04 {  
  26.     public static void main(String[] args) {  
  27.         Set<Person> allSet = new TreeSet<Person>();// 实例化Set接口对象  
  28.         allSet.add(new Person("张三"30));           // 加入元素  
  29.         allSet.add(new Person("李四"31));           // 加入元素  
  30.         allSet.add(new Person("王五"32));           // 加入元素  
  31.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  32.         allSet.add(new Person("王五"32));       // 重复元素,不能加入  
  33.         allSet.add(new Person("赵六"33));           // 加入元素  
  34.         allSet.add(new Person("孙七"33));       // 年龄重复  
  35.         System.out.println(allSet);                 // 输出集合,调用  
  36. toString()  
  37.     }  

程序运行结果:

  1. [姓名:张三;年龄:30, 姓名:李四;年龄:31, 姓名:
    王五;年龄:32, 姓名:孙七;年龄:33, 姓名:赵六;年龄:33

以上的程序运行结果中出现了"孙七",而且去掉了重复的内容,但此时的重复内     容去掉,并不是真正意义上的去掉重复元素。因为此时靠的是Comparable完成的,而如果    换成HashSet则也会出现重复的内容,所以要想真正地去掉重复元素,则必须深入研究  Object类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值