(一) Comparable
Comparable是在集合内部定义的方法实现的排序,位于java.util下。是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操作。自定义类要在加入list容器中后能够排序,也可以实现Comparable接口,在用Collections类的sort方法排序时若不指定Comparator,那就以自然顺序排序。所谓自然顺序就是实现Comparable接口设定的排序方式。
(二)Comparator
Comparator是在集合外部实现的排序,位于java.lang下。是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。使用方法只能用Collections类的sort方法,并且是传递两个参数进去(List list,Class class),第一个参数是集合的对象list,第二个是实现了comparator接口的实现类的对象。
下面来看一个例子来具体了解一下:问题:某班30个学生的学号为20070301-20070330,全部选修了Java程序设计课程,给出所有同学的成绩(可用随机数产生,范围60-100),请编写程序将本班各位同学的成绩按照从低到高排序打印输出。
先用ArrayList的方式来实现:
package com.java.javase._0424_cpmpare;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Random;
class Student {
int num, grade;
String name;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(int num, int grade, String name) {
super();
this.num = num;
this.grade = grade;
this.name = name;
}
@Override
public String toString() {
return "学号"+this.num+" "+"姓名"+this.name+" "+"成绩"+this.grade;
}
}
class ArrayLsitSort implements Comparator<Student>
{
@Override
public int compare(Student o1, Student o2) {
if (o1.grade > o2.grade)
return 1;//如果返回为一个正数,则代表括号内的内容成立,否则不成立
else if (o1.grade < o2.grade)
return -1;
else
return (o1.name.compareTo(o2.name));
}
}
public class TestArrayList {
public static void main(String[] args) {
ArrayList<Student> list=new ArrayList<Student>();
Random random=new Random(47);
for(int i=20070301,j=10;i<=20070330;i++,j++)
{
list.add(new Student(i,random.nextInt(41)+60,"同学"+j));
}
Collections.sort(list,new ArrayLsitSort());
for(Student student:list)
System.out.println(student);
}
}
这种方法是使用了实现Comparator接口的方法,注意Collections.sort方法必须传入两个参数,第一个参数是集合的对象list,第二个是实现了comparator接口的实现类的对象,
package com.java.javase._0424_cpmpare;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
class Student1 implements Comparable{
int num, grade;
String name;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student1(int num, int grade, String name) {
super();
this.num = num;
this.grade = grade;
this.name = name;
}
@Override
public String toString() {
return "学号"+this.num+" "+"姓名"+this.name+" "+"成绩"+this.grade;
}
@Override
public int compareTo(Object o) {
return name.compareTo(((Student1)o).name);
}
}
public class TestArrayList1 {
public static void main(String[] args) {
ArrayList list1=new ArrayList();
Random random=new Random(47);
for(int i=20070301,j=10;i<=20070330;i++,j++)
{
list1.add(new Student1(i,random.nextInt(41)+60,"同学"+j));
}
Collections.sort(list1);
System.out.println(list1);
}
}
这是实现了Comparable的接口的方法,要覆写compareTo方法,但其中的比较的内容只能是实现了Comparable接口的方法比如String或者Integer,对list进行排序必须要调用Collections.sort(list)方法否则不会排序
再看一下TreeSet的方法:
package com.java.javase._0424_cpmpare;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Random;
import java.util.TreeSet;
class Student2{
int num;
int grade;
String name;
public Student2(int num, int grade, String name) {
super();
this.num = num;
this.grade = grade;
this.name = name;
}
}
class TreeSetSort implements Comparator<Student2>{
@Override
public int compare(Student2 o1, Student2 o2) {
if (o1.grade > o2.grade)
return 1;
else if (o1.grade < o2.grade)
return -1;
else
return (o1.name.compareTo(o2.name));
}
}
public class TestTreeSet {
public static void main(String[] args) {
TreeSet <Student2>treeset=new TreeSet<Student2>(new TreeSetSort());
Random random=new Random(47);
for(int i=20070301,j=1;i<=20070330;i++,j++)
{
treeset.add(new Student2(i,random.nextInt(41)+60,"同学"+j));
}
Iterator <Student2>it=treeset.iterator();
while(it.hasNext())
{
Student2 stu=it.next();
System.out.println("学号"+stu.num+" "+"姓名"+stu.name+" "+"成绩"+stu.grade);
}
}
}
最后看一下HashSet方法
package com.java.javase._0424_cpmpare;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Random;
class Student3{
int num;
int grade;
String name;
public Student3(int num, int grade, String name) {
super();
this.num = num;
this.grade = grade;
this.name = name;
}
@Override
public String toString() {
return "学号"+this.num+" "+"姓名"+this.name+" "+"成绩"+this.grade;
}
}
class TreeSort implements Comparator<Student3>{
@Override
public int compare(Student3 o1, Student3 o2) {
if (o1.grade > o2.grade)
return 1;
else if (o1.grade < o2.grade)
return -1;
else
return (o1.name.compareTo(o2.name));
}
}
public class TestHashSet {
public static void main(String[] args) {
HashSet<Student3>hashset=new HashSet<Student3>();
Random random=new Random(47);
for(int i=20070301,j=1;i<=20070330;i++,j++)
{
hashset.add(new Student3(i,random.nextInt(41)+60,"同学"+j));
}
ArrayList<Student3>list=new ArrayList<Student3>(hashset);
Collections.sort(list,new TreeSort());
for(Student3 student3:list)
System.out.println(student3);
}
}
对HashSet的排序,通过将Set集合转化为List集合,借助Collections.Sort( )方法实现排序。
package com.java.javase._0424_cpmpare;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
public class TestTreeMap {
public static void main(String[] args) {
//1.创建集合
TreeMap<Student4,Integer> tm=new TreeMap<Student4,Integer>();
for(int i=20070301,j=10;i<=20070330;i++,j++)
{
int grade=(int) (40*Math.random()+60);
//2、往集合对象中添加元素
tm.put(new Student4(grade,"同学"+j),i);
}
//3.遍历集合 ,排序完成
Set<Student4> k=tm.keySet();
Iterator<Student4> it=k.iterator();
while(it.hasNext()){
Student4 key=it.next();
Integer num=tm.get(key);
System.out.println("学号:"+num+" "+"姓名:"+key.name+" "+"成绩:"+key.grade);
}
}
}
class Student4 implements Comparable<Student4>{
int grade;
String name;
public Student4(int grade,String name){
this.grade =grade;
this.name=name;
}
@Override
public int compareTo(Student4 o) {
if(this.grade>o.grade)
return 1;
if(this.grade==o.grade)
{ //当成绩相同时,按照姓名排序
return this.name.compareTo(o.name);
}
return -1;
}
}