自己总结了一下集合对对象的排序问题
最近在学Oracle,时间上还是挺充足的,所以今天复习了一下J2SE的内容。关于集合Collection接口里的实现类里对对象的排序问题研究了一下,
TreeSet是实现Set这个接口的一个实现类,除了这个接口他还实现了SortedSet这个接口,
它使用红黑树结构来对加入的 对象进行自然排序。看下面这个例子:
import java.util.*;
public class TreeSetDemo {
public static void main(String[] args) {
Set set = new TreeSet();
set.add("justin");
set.add("caterpillar");
set.add("momor");
set.add("justin");
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
}
}
输出结果会按字典里的顺序进行排序caterpillar justin momor
现在讲我们如果声明一个类,按照类的某个属性进行排序(eg:Student类,age属性进行排序),我总结了 有两种方法可以实现,下面一一介绍:
第一种:由于TreeSet的构造器中有一个public TreeSet(Comparator<? super E> comparator)构造一个新的空 TreeSet,它根据指定比较器进行排序。这样说下去可能会有点模糊,下面举个例子:
TreeSet对对象排序
class Student implements Comparator
{
private int id;
private String name;
private String sex;
private int age;
public Student()
{
}
public Student(int id,String name,String sex,int age)
{
this.id=id;
this.name=name;
this.sex=sex;
this.age=age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compare(Object o1, Object o2) {
return ((Student)o1).getAge()-((Student)o2).getAge();
}
//重写toString方法
public String toString()
{
return "id:"+id+" name:"+name+" age:"+age+" sex"+sex;
}
public static void main(String[] args) {
Student s = new Student();
TreeSet<Student> ts=new TreeSet<Student>(s);
ts.add(new Student(01,"Tom","man",18));
ts.add(new Student(02,"Austin","man",15));
ts.add(new Student(03,"Lily","woman",21));
ts.add(new Student(04,"Emily","man",20));
Iterator it=ts.iterator();
while(it.hasNext())
{
System.out.println(((Student)it.next()));
}
}
}
这 个类实现了Comparator接口,固添加到TreeSet里得对象都会按照我们写的compare()方法去排序。
第二种方法:由于 JDK为集合提供一个Collections类,他就是返回 collection 的静态方法组成,
里面定义了许多方法操作集合类,而且 这些方法都是静态的!我们注意到里面也有我们想要的sort()方法,只不过给定的参数是List接口的实现类,我们应该想到效率高一些的 ArrayList,由于他是不同步的所以要比Vector效率高一些,一样,我们举个例子看看:
class Student implements Comparable
{
private int id;
private String name;
private String sex;
private int age;
public Student(int id,String name,String sex,int age)
{
this.id=id;
this.name=name;
this.sex=sex;
this.age=age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Object o) {
return ((Student)o).getAge()-this.age;
}
//重写toString方法
public String toString()
{
return "id:"+id+" name:"+name+" age:"+age+" sex"+sex;
}
public static void main(String[] args) {
ArrayList<Student> al=new ArrayList<Student>();
al.add(new Student(01,"Tom","man",18));
al.add(new Student(02,"Austin","man",15));
al.add(new Student(03,"Lily","woman",21));
al.add(new Student(04,"Emily","man",20));
Collections.sort(al);
Iterator it=al.iterator();
while(it.hasNext())
{
System.out.println(((Student)it.next()));
}
}
}
明白了吧?很简单就实现了对象的排序!
集合类应该在J2SE里算是重点,以后项目 中应该经常用到,其实他和数组差不多,只不过数组用来存放相同类型的元素,而集合可以存放不同的数据类型,我们也可以通过泛型规定他的类型,这样操作起来 就不用在转换了!
小弟刚刚学习JAVA,有什么不对的地方望指教!