[第三季]11.在TreeSet中添加自定义对象

本文介绍如何在Java中使用TreeSet存储自定义对象,并通过实现Comparable接口或使用Comparator来进行排序。具体包括Person和Dog类的定义、排序方法的实现及输出格式调整。

复习笔记
[第三季]11.在TreeSet中添加自定义对象
1.TreeSet里添加Person
注意:
class Person
{

}
Person后面不用加括号().
①先创建TreeSet里面添加3个Person New.
②创建Class Person定义两个参数,分别是名称,年龄.
定义构造函数,并设置2个参数.
定义Print函数打印name和age,其中使用字符串格式化方法.
③用add方法新建三个,这里可以使用alt+ctrl+向下箭头进行快速的复制。再用迭代器穿件指针it,并打印里面的所有内容.迭代器里

面放的是String.
④使用Person继承与Comparable,并实现排序方法.
这个时候会出现错误,javastudy.Person cannot be cast to java.lang.Comparable,说明Person是没有办法进行比较的,解决方

法是在person后面加上“class Person implements Comparable”
这个时候又出现了错误,我们看看:
The type Person must implement the inherited abstract method Comparable.compareTo(Person)
这说明继承了之后需要重写一下compareTo(Person)这个函数,以确定Person的排序方法.
我们根据提示点击Add unimplement method,并根据o.age进行排序,里面用到了if语句.

⑤回到第①步那里打印结果看看. 结果是
javastudy.Person@15db9742
javastudy.Person@6d06d69c
javastudy.Person@7852e922
这是各个对象的物理地址,这个不是我们想要的.
⑥在Person里面重写toString方法,把name和age传回去,这就可以了.再次打印,结果满意.
名字:lala,年龄:20
名字:lblb,年龄:21
名字:lclc,年龄:22
⑦定义一个Dog类,定义名称和重量.
定义构造函数,设置名称和重量.
重写toString方法,这里可以使用String.format方法来格式化字符串,并返回字符串.
2.TreeSet 添加Dog
①实例化一个TreeSet,里面存放着Dog累,并存放在dg这个实例里.
②使用迭代器遍历打印,知识与上面的iterator相同.但是这里会出错,因为Dog是没有办法排序的,这里的知识与上节课的知识相呼

应,TreeSet里面的东西是要先进行排序,否则无法使用iterator的next和hasnext功能.
知识补充:迭代器是一种设计模式,它是一种对象,它可以遍历选择序列中的对象,而开发人员不需要了解该序列的底层结构.迭代器通

常被称为”轻量级”对象,因为创建它的代价小.
③在main的外面写一个class MyCom 继承与Comparator.
里面重写compare方法,传入Dog o1, Dog o2两个变量,返回值是name的比较值(字符串和数值都是可以进行比较的).
④在实例化dg的地方,传入比较器new TreeSet(new MyCom()).
⑤用add方法加入new Dog,注意和Dog函数相对应.
⑥回到第②步的迭代器那里进行打印,查看一下结果.

package javastudy;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

public class Test2 
{

    public static void main(String[] args) 
    {

        TreeSet<Person>ts=new TreeSet<Person>();
        ts.add(new Person("jack",20));
        ts.add(new Person("mary",18));
        ts.add(new Person("jc",10));


        Iterator<Person>it=ts.iterator();
        while(it.hasNext())
        {

            //****************第1步出现错误****************
            //****************.Person cannot be cast to java.lang.Comparable
            Person p=it.next();
            p.print();
        }



        //****************第6步****************
        TreeSet<Dog>dg=new TreeSet<Dog>(new MyCom());
        //****************第9步上面new MyCom(),目的是传入比较器的对象****************
        dg.add(new Dog("maomao", 18));
        dg.add(new Dog("niuniu", 16));
        dg.add(new Dog("lala", 21));


        //****************第7步****************
        Iterator<Dog>it2=dg.iterator();
        while(it2.hasNext())
        {
            System.out.println(it2.next());
        }
        //接下来报错 javastudy.Dog cannot be cast to java.lang.Comparable
    }

}
//****************第8步****************
class MyCom implements Comparator<Dog>
{

    @Override
    public int compare(Dog o1, Dog o2) 
    {
        return o1.name.compareTo(o2.name);
    }  

}

//****************第2步implements Comparable<Person>****************
class Person implements Comparable<Person>
{
    String name;
    int age;
    Person(String name,int age) 
    {
        this.name=name;
        this.age=age;
    }

    void print()
    {
        System.out.println(String.format("姓名=%s,年龄=%d", name,age));
    }
    //****************第3步****************
    @Override
    public int compareTo(Person o) 
    {
        if(this.age>o.age)
        {
            return 1;
        }else if (this.age<o.age) 
        {
            return -1;
        }else 
        {
            return 0;
        }

    }
}

//****************第5步****************
class Dog
{
    String name;
    int weight;
    Dog(String name,int weight) 
    {
        this.name=name;
        this.weight=weight;
    }
    @Override
    public String toString() 
    {
        return "Dog name=" + name + ", weight=" + weight;
    }
}
在Java中,使用`TreeSet`对自定义对象进行排序时,必须提供排序规则,因为`TreeSet`无法自动对非`Comparable`类型的对象进行排序。如果没有定义排序规则,运行时会抛出`ClassCastException`异常,提示自定义类无法被强制转换为`Comparable`类型[^1]。 为了实现自定义对象的排序,可以通过以下两种方式之一完成: ### 1. 实现 `Comparable` 接口 自定义类可以实现`Comparable<T>`接口,重写`compareTo(T o)`方法,定义对象之间的自然排序规则。例如: ```java class Student implements Comparable<Student> { String name; int score; public Student(String name, int score) { this.name = name; this.score = score; } @Override public int compareTo(Student other) { return Integer.compare(this.score, other.score); // 按照 score 升序排列 } @Override public String toString() { return "Student{name='" + name + "', score=" + score + "}"; } } ``` 然后可以直接将对象添加到`TreeSet<Student>`中: ```java Set<Student> students = new TreeSet<>(); students.add(new Student("Li Ming", 98)); students.add(new Student("Zhang San", 76)); students.add(new Student("Wang Gang", 88)); ``` ### 2. 使用自定义 `Comparator` 如果自定义类无法修改或需要支持多种排序方式,可以在创建`TreeSet`时传入一个实现了`Comparator<T>`接口的比较器。例如: ```java class Person { int age; String name; public Person(int age, String name) { this.age = age; this.name = name; } @Override public String toString() { return name + " , " + age; } } ``` 定义排序器类: ```java class PersonAgeComparator implements Comparator<Person> { @Override public int compare(Person p1, Person p2) { return Integer.compare(p1.age, p2.age); } } ``` 使用自定义比较器初始化`TreeSet`: ```java Set<Person> people = new TreeSet<>(new PersonAgeComparator()); people.add(new Person(23, "one")); people.add(new Person(88, "two")); people.add(new Person(21, "three")); for (Person p : people) { System.out.println(p); } ``` 上述方法可以确保`TreeSet`按照指定规则对自定义对象进行排序,避免出现类型转换异常的情况[^2]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值