Comparator與Comparable用法小結
阿新 • • 發佈:2020-12-19
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更加靈活!
具體用哪個看題意!