复习笔记
[第三季]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;
}
}