Set集合练习

Collection有2个子接口:
1.list(列表):有序,可重复

2.set(集):无序,不可重复
hashSet:底层数据结构是哈希表。线程不同步。通过判断元素的hashCode值是否相同保证元素的唯一。若相同,继续判断元素的equals方法

TreeSet:底层数据结构是二叉树,通过compareTo方法保证元素唯一,两种排序方式:
①让元素自身具备比较性,通过实现Comparable接口,覆盖compareTo方法。也叫自然顺序、默认顺序
②当元素自身不具备比较性,或者具备的比较性不适用时,这时需要让集合自身初始化时就具备比较性

Tips:排序时,当主要条件相同时,一定要再判断次要条件

练习:往TreeSet集合中存储自定义对象学生,按照年龄排序

import java.util.*
public  class TreeSetDemo {
public static void main(String[] args) {
    TreeSet ts = new TreeSet();
    ts.add(new Student("xuesheng01",23));
    ts.add(new Student("xuesheng04",13));
    ts.add(new Student("xuesheng03",13));
    ts.add(new Student("xuesheng02",9));
    
    Iterator it = ts.iterator();//使用迭代器迭代
    while (it.hasNext())
    {
        Student stu =(Student)it.next();//迭代器的next方法返回值类型是object,所以要向下转型
        System.out.println(stu.getName()+"---"+stu.getAge());
    };
}
public class Student implements Comparable//这里使用的是第二种方法,让集合自身具备比较性
{
private String name;
private int age;
public Student (String name, int age)
    {
    this.name = name;
    this.age = age;
    }
public int compareTo(Object obj)
    {
    if(!(obj instanceof Student))//判断是否是学生对象实例
        throw new RuntimeException("不是学生对象");//若不是则抛出异常
    Student s = (Student)obj;
    if(this.age>s.age)//和新增对象的年龄,进行比较
        return 1;//返回正数。代表新增的年龄较小
    if(this.age==s.age)
    {
        return this.name.compareTo(s.name);//当主要条件相同,则比较次要条件
    }
    return -1;}//否则返回负数,代表新增的对象年龄较大     
public String getName()
    {
        return name;
    }
public int getAge()
    {
        return age;
    }   
}}

运行结果为:

xuesheng02---9
xuesheng03---13
xuesheng04---13
xuesheng01---23

期间遇到报错:

  Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
   No enclosing instance of type TreeSetDemo is accessible. Must qualify the allocation with an enclosing       
   instance of type TreeSetDemo (e.g. x.new A() where x is an instance of TreeSetDemo).
    at myobject.TreeSetDemo.main(TreeSetDemo.java:13)
  • 问题产生原因:内部类Student是动态的,即public class开头。而主程序是public static class main。在Java中,类中的静态方法不能直接调用动态方法。只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法。
  • 解决方案:在不做其他变动的情况下,最简单的解决办法是将public class改为public static class.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 32,140评论 18 399
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,726评论 0 16
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,773评论 19 139
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 5,025评论 0 2
  • 春节前一天,我把办公室收拾得窗明几净,还理了个帅头,换上身新衣,皮鞋也擦得锃明瓦亮! 新的一年,我要向世界宣告:戒...
    丙超阅读 1,384评论 1 2