黑马程序员技术交流社区
标题:
集合小结-排序
[打印本页]
作者:
黑马-李嘉欣
时间:
2013-3-28 18:25
标题:
集合小结-排序
看完了集合部分,感觉有几个知识点很重要,参考了一些说法,总结如下:
集合中的两种排序方式?
排序有两个要素:元素和集合
1)第一种排序方式:自然排序
让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法,这种方式也称为元素的自然排序或默认排序方式。
/*
第一种排序方式:自然排序,实现Comparable接口,重写compareTo方法
需求:
向TreeSet集合中存储自定义对象学生
按照学生的年龄进行排序
*/
import java.util.*;
//此接口强制让Student实现比较性
class Student implements Comparable
{
//定义Student私有属性
private String name;
private int age;
//构造Student函数,初始化
Student(String name,int age)
{
this.name = name;
this.age = age;
}
//公共访问方法,访问私有属性
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
//复写Comparator中的compare方法,自定义比较器
public int compareTo(Object obj)
{
//判断是否属于Student类型,否则抛异常
if (!(obj instanceof Student))
throw new RuntimeException("NotSuchTypeException");
//将Object类对象强转为Student类
Student s = (Student)obj;
//System.out.println(this.age + "--compare-" + s.age);//测试用,查看比较情况
//按年龄大小比较,相同则比较姓名大小,不同返回两年龄之差
if (this.age == s.age)
{
return this.name.compareTo(s.name);
}
else if (this.age <s.age)
return this.age-s.age;
return this.age-s.age;
}
/*
//如果按照存入顺序输出
public int compareTo()
{
return 1;//改为-1则按倒叙输出
}
*/
}
//测试
class TreeSetTest
{
public static void main(String[] args)
{
//创建集合,并添加元素
TreeSet ts = new TreeSet();
ts.add(new Student("li01",25));
ts.add(new Student("li02",20));
ts.add(new Student("li01",22));
ts.add(new Student("li05",24));
ts.add(new Student("li08",40));
//打印集合中元素
printE(ts);
System.out.println("Hello World!");
}
//定义打印集合中元素的功能
public static void printE(TreeSet ts)
{
//迭代器方法获取
Iterator it = ts.iterator();
while (it.hasNext())
{
//将返回的元素(Object类)强转为Student类
Student s = (Student)it.next();
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
2)第二种排序方式:比较器
当元素自身不具备比较性是,或者具备比较性,却不是所需要的,这时就需要让集合自身具备比较性。在集合初始化时就有了比较方式(即参阅构造函数)。
当两种排序方式都存在时,以比较器为主。
如何构造比较器:定义一个类,实现Comparator接口,覆盖compare方法。
import java.util.*;
//此接口强制让Student实现比较性
class Student implements Comparable
{
//定义Student私有属性
private String name;
private int age;
//构造Student函数,初始化
Student(String name,int age)
{
this.name = name;
this.age = age;
}
//公共访问方法,访问私有属性
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
//复写Comparator中的compare方法,自定义比较器
public int compareTo(Object obj)
{
//判断是否属于Student类型,否则抛异常
if (!(obj instanceof Student))
throw new RuntimeException("NotSuchTypeException");
//按年龄大小比较,相同则比较姓名大小,不同返回两年龄之差
Student s = (Student)obj;
if (this.age > s.age)
return this.age-s.age;
else if (this.age == s.age)
{
return this.name.compareTo(s.name);
}
return this.age-s.age;
}
}
//定义比较器,实现Comparator接口
class MyCompare implements Comparator
{
//重写Comparator中的compare方法,按姓名顺序排序
public int compare(Object o1,Object o2)
{
//判断给定对象是否为Student类,否则抛异常
if (!((o1 instanceof Student) && (o2 instanceof Student)))
throw new RuntimeException("NotSuchTypeException");
//将给定对象强转为Student类
Student s1 = (Student)o1;
Student s2 = (Student)o2;
//比较名字,返回数值,相同则比较年龄
int n = s1.getName().compareTo(s2.getName());
if (n == 0)
return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));
return n;
}
}
//测试
class TreeSetComDemo
{
public static void main(String[] args)
{
//TreeSet ts = new TreeSet();
//创建集合,加入接口类参数,并添加元素
TreeSet ts = new TreeSet(new MyCompare());
ts.add(new Student("li01",25));
ts.add(new Student("li02",20));
ts.add(new Student("li01",22));
ts.add(new Student("li05",24));
ts.add(new Student("li08",40));
//打印集合中元素
printE(ts);
}
//定义打印集合中元素的功能
public static void printE(TreeSet ts)
{
//迭代器方法获取
Iterator it = ts.iterator();
while (it.hasNext())
{
//将返回的元素(Object类)强转为Student类
Student s = (Student)it.next();
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2