Java中的Comparable接口和Comparator接口

(一) 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( )方法实现排序。


最后是TreeMap
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;    
  
    }  
      
  
      
}  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值