首先,楼主没有用泛型,会出现一对黄线,虽然没报错,看着不爽,最好用上泛型,可以省去第20行的类型转换。
其次,也是最重要的,楼主要查看笔记或者API找到TreeSet的特性。
1. TreeSet底层机构是二叉树,这个集合是要按照某种规则对元素进行排序。
排序有两种方法:(1) 让元素所属的类实现Comparable接口。
(2) 在创建集合的时候,在构造参数中传递Comparator接口的子类对象。
2. 元素要保证唯一性。
上面二楼是用的第一种方法:让元素所属的类实现Comparable接口排序。
一般在应用上经常采用的是第二种方法,这样不用去修改元素所属类。下面是我的代码:
import java.util.Comparator;
import java.util.TreeSet;
class TreeSetDemo
{
public static void main(String[] args)
{
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
int num = s1.getAge() - s2.getAge(); // 主要条件:年龄。先按照年龄排序。
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; // 次要条件:姓名。再按照姓名排序。
return num2;
}
});
ts.add(new Student("lisi02",22));
ts.add(new Student("lisi007",20));
ts.add(new Student("lisi09",19));
ts.add(new Student("lisi01",40));
//这里我用了增强for遍历,代码简单方便,下面也有用迭代器遍历的代码,注释了。
for(Student s : ts){
System.out.println(s.getName()+"---"+s.getAge());
}
// 迭代器遍历
// Iterator<Student> it = ts.iterator();
// while (it.hasNext())
// {
// Student s = it.next();
// System.out.println(s.getName()+"---"+s.getAge());
// }
}
}
class Student
{
private String name;
private int age;
Student(String name,int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
|