1. 程式人生 > 其它 >Comparator與Comparable用法小結

Comparator與Comparable用法小結

技術標籤:javaobject介面

Comparator與Comparable用法小結
此處以一道PTA 上的java題為例
6-1 學生資訊管理 (20分)

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        Student[] stus = new
Student[3]; for(int i=0;i<3;i++){ int no = scan.nextInt(); String name = scan.next(); Student s = new Student(no,name); stus[i] =s; } //將stus中的3個學生物件,放入到HashSet中 HashSet<Student> stuSet = new HashSet<Student>
(); for(Student s: stus){ stuSet.add(s); } //要放入的第4個Student Student fourth = new Student(scan.nextInt(),scan.next()); stuSet.add(fourth);//如果fourth的學號(no)與stuSet中的已有學生的no重複則無法放入 System.out.println(stuSet.size()); Arrays.sort(stus);//對stus中的3個原有物件,按照姓名首字元有小到大排序
for(int i=0;i<stus.length;i++){ System.out.println(stus[i]);//輸出的格式為:no=XX&name=YY } scan.close(); } } /*你的程式碼被嵌在這裡*/

1)如果用Comparable介面
要完成的學生類:

class Student implements Comparable<Student>{//注意Arrays.sort的形式,不能用Comparator
	int no;
	String name;
	
	public Student(int no,String name) {//建構函式
		this.no=no;
		this.name=name;
	}
	
	@Override
	public String toString() {//重寫toString()
		return "no="+this.no+"&name="+this.name;
	}
	
	@Override
	public boolean equals(Object o) {//重寫equals
		if(o==null)return false;
		Student ss=(Student)o;
		
		if(this.no==ss.no) {
			return true;
		}else {
			return false;
		}
	}
	
	@Override
	public int hashCode() {//重寫hashCode()
		int i=11;
		i=i*31+this.no;
		return i;
	}
	
	@Override
	public int compareTo(Student s1) {//繼承comparable,重寫compareTo!
		return this.name.compareTo(s1.name);//注意字母升序
	}
}

總結1:
comparable直接將其實現在類的內部
需要對public int compareTo(Student s){}
進行重寫!
此時對應的Arrays.sort引數列表為:
Arrays.sort(物件陣列);

 Arrays.sort(stus);

2)如果用Comparator介面:

需要寫一個類,這裡以對name升序排列為例!

寫一個sortByName類:

class sortByName implements Comparator<Student>{
	public int compare(Student s1,Student s2) {
		return s1.name.compareTo(s2.name);//升序
	}
}

對應呼叫Arrays.sort時引數表為:
Arrays.sort(物件陣列,排序方法類);

 Arrays.sort(stus,new sortByName());

總結2:
Comparator與Comparable不同的是Comparator是寫在這個類(這裡指Student)之外的!
Comparator更加靈活!
具體用哪個看題意!