黑马程序员_TreeSet集合存储自定义对象


 ------- android培训java培训、期待与您交流! ----------

package 演示练习;

import java.util.*;
//思路:TreeSet集合自带排序功能,其实底层调用的就是所存对象的Equats方法,而如果自定义对象时,有的对象内在Equals方法是继承的Object的equals方法,但此方法是Object根类为比较
//子类对象hash地址是否相同,而设定,所以有两种方式可以使自定的元素添加到TreeSet集合中,1,就是实现comparable并要覆写接口compareTo方法,使对象具备比较性,2,就是创建一个带有比较器的TreeSet集合
//使集合本身带有比较功能,但必须限定要存入比较的对象可以调用此比较器中的方法,这就使存入的元素必须是设定比较器的泛型本类或者子类对象;
class rencomparator implements Comparator<ren>//此处限制泛型ren的本类或者子类,防止传入其他类型的数据,造成存储失败
{
public int compare(ren a,ren b)
{
if(a.getage()==b.getage())
return a.getname().compareTo(b.getname());
return a.getage()-b.getage();

}
}
/*
class ren implements Comparable<ren>//此处限制泛型ren的本类或者子类,防止传入其他类型的数据,造成存储失败
{
private String name;
private int age;
ren(String name,int age)
{
this.name=name;
this.age=age;
}
public String getname()
{
return name;
}
public int getage()
{
return age;
}
public int compareTo(ren a)


if( this.getname().compareTo(a.getname())==0)
return this.getage()-a.getage();
return this.getname().compareTo(a.getname());
}








}
class xuesheng extends ren
{
xuesheng(String name,int age)
{
super(name,age);
}
public void study()
{
yanshi.sopl("好好学习");
}

}
class worker extends ren
{
worker(String name,int age)
{
super(name,age);
}
void work()
{
yanshi.sopl("为社会做贡献");
}
}


*/




public class TreeSet集合存储自定义对象 {


public static void main(String[] args) {
// TODO 自动生成的方法存根
TreeSet ts=new TreeSet(Collections.reverseOrder(new rencomparator()));
//ArrayList ts=new ArrayList();
ts.add(new ren("zhang三",23));
ts.add(new xuesheng("zhang三",26));
ts.add(new ren("li四",28));
ts.add(new worker("song六",19));
ts.add(new ren("lin九",12));
ts.add(new ren("wang五",19));
//ts.add("hjkalsjndk");
//yanshi.sopl(ts);
//Collections.reverse(ts);
Iterator<ren> it=ts.iterator();
while(it.hasNext())
{ren a=it.next();
  yanshi.sopl(a.getname()+"--"+a.getage());}






}
}
 ------- android培训java培训、期待与您交流! ----------

在Java中,TreeSet集合默认按照元素的自然顺序进行排序,但当存储自定义对象时,就需要为TreeSet指定排序规则。这通常是通过让自定义对象的类实现Comparable接口来完成的,或者通过提供一个Comparator来指定排序逻辑。以下是两种方式的示例: 1. 实现Comparable接口: 自定义类需要实现Comparable接口,重写compareTo方法。这个方法定义对象TreeSet中的排序规则。 ```java class Person implements Comparable<Person> { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } // GetterSetter方法 @Override public int compareTo(Person other) { return Integer.compare(this.age, other.age); // 按照年龄排序 } } TreeSet<Person> set = new TreeSet<>(); set.add(new Person("Alice", 25)); set.add(new Person("Bob", 22)); ``` 在这个例子中,Person类实现了Comparable接口,且根据年龄(age)进行排序。 2. 提供Comparator: 如果不希望或不能修改自定义类(比如使用第三方库中的类),则可以在创建TreeSet时提供一个Comparator。 ```java Comparator<Person> ageComparator = new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { return Integer.compare(p1.getAge(), p2.getAge()); // 按照年龄排序 } }; TreeSet<Person> set = new TreeSet<>(ageComparator); set.add(new Person("Alice", 25)); set.add(new Person("Bob", 22)); ``` 在这个例子中,我们创建了一个Comparator来指定按年龄排序,将其传递给TreeSet的构造函数。 两种方式都可以实现自定义对象TreeSet中的排序,选择哪一种取决于是否希望修改自定义对象的类,或者是否需要多个不同的排序规则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值