java的比較器有兩類,分別是Comparable接口和Comparator接口。java
在爲對象數組進行排序時,比較器的做用很是明顯,首先來說解Comparable接口。數組
讓須要進行排序的對象實現Comparable接口,重寫其中的compareTo(T o)方法,在其中定義排序規則,那麼就能夠直接調用java.util.Arrays.sort()來排序對象數組,實例以下:dom
- class Student implements Comparable<Student>{
- private String name;
- private int age;
- private float score;
-
- public Student(String name, int age, float score) {
- this.name = name;
- this.age = age;
- this.score = score;
- }
-
- public String toString()
- {
- return name+"\t\t"+age+"\t\t"+score;
- }
-
- @Override
- public int compareTo(Student o) {
-
- if(this.score>o.score)
- return -1;
- else if(this.score<o.score)
- return 1;
- else{
- if(this.age>o.age)
- return 1;
- else if(this.age<o.age)
- return -1;
- else
- return 0;
- }
- }
- }
-
- public class ComparableDemo01 {
-
-
-
-
- public static void main(String[] args) {
-
- Student stu[]={new Student("zhangsan",20,90.0f),
- new Student("lisi",22,90.0f),
- new Student("wangwu",20,99.0f),
- new Student("sunliu",22,100.0f)};
- java.util.Arrays.sort(stu);
- for(Student s:stu)
- {
- System.out.println(s);
- }
- }
- }
在上面的程序中,實現了Comparable接口,並重寫了compareTo方法,將學生先按成績由大到小排名,成績相同時候按照年齡由低到高排序。ide
執行的結果是this
sunliu 22 100.0
wangwu 20 99.0
zhangsan 20 90.0
lisi 22 90.0url
可是在設計類的時候,可能沒有考慮到讓類實現Comparable接口,那麼就須要用到另外的一個比較器接口Comparator。spa
從上面的實例咱們能夠發現,compareTo(T o)只有一個參數,而Comparator接口中必需要實現的compare(T o1,T o2)就有兩個參數。.net
代碼實例設計
- package edu.sjtu.ist.comutil;
-
- import java.util.Comparator;
-
- class Student {
- private String name;
- private int age;
- private float score;
-
- public Student(String name, int age, float score) {
- this.name = name;
- this.age = age;
- this.score = score;
- }
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public float getScore() {
- return score;
- }
- public void setScore(float score) {
- this.score = score;
- }
-
- public String toString()
- {
- return name+"\t\t"+age+"\t\t"+score;
- }
-
- }
-
- class StudentComparator implements Comparator<Student>{
-
- @Override
- public int compare(Student o1, Student o2) {
-
- if(o1.getScore()>o2.getScore())
- return -1;
- else if(o1.getScore()<o2.getScore())
- return 1;
- else{
- if(o1.getAge()>o2.getAge())
- return 1;
- else if(o1.getAge()<o2.getAge())
- return -1;
- else
- return 0;
- }
- }
-
- }
-
-
- public class ComparableDemo02 {
-
-
-
-
- public static void main(String[] args) {
-
-
- Student stu[]={new Student("zhangsan",20,90.0f),
- new Student("lisi",22,90.0f),
- new Student("wangwu",20,99.0f),
- new Student("sunliu",22,100.0f)};
- java.util.Arrays.sort(stu,new StudentComparator());
- for(Student s:stu)
- {
- System.out.println(s);
- }
- }
-
- }
上面依然是對student對象數組進行排序,用的都是Array.sort方法,不一樣的是實現comparator接口時,sort方法須要傳進來兩個參數,即stu對象數組,以及重寫的實現了comparator比較方法類。code
程序運行的結果和上面是同樣的
Array.sort是對數組進行排序,假如咱們不想使用數組,想使用Collection接口下的集合,如想使用List,那麼須要稍微作些修改:
package
comparatorTest
;
/**
* 定義一個學生類
* 包括學號,姓名,數學成績,語文成績
* @author zhangnan
*
*/
public
class
Student
{
private
String
Name
;
private
int
ID
;
private
int
scoreMath
;
private
int
scoreChi
;
public
Student
(
String
name
,
int
ID
,
int
score1
,
int
score2
){
this
.
Name
=
name
;
this
.
ID
=
ID
;
this
.
scoreMath
=
score1
;
this
.
scoreChi
=
score2
;
}
public
String
getName
(){
return
this
.
Name
;
}
public
void
setName
(
String
pname
){
this
.
Name
=
pname
;
}
public
int
getID
(){
return
this
.
ID
;
}
public
void
setID
(
int
pID
){
this
.
ID
=
pID
;
}
public
int
getMathScore
(){
return
scoreMath
;
}
public
void
setMathScore
(
int
score1
){
this
.
scoreMath
=
score1
;
}
public
float
getChiScore
(){
return
scoreChi
;
}
public
void
setChiScore
(
int
score2
){
this
.
scoreChi
=
score2
;
}
/**
* 返回學生信息
*/
public
String
toString
(){
return
Integer
.
toString
(
ID
)+
"\t\t"
+
Name
+
"\t\t"
+
Integer
.
toString
(
scoreMath
)+
"\t\t"
+
Integer
.
toString
(
scoreChi
);
}
}
--------------------------------------------------------------------------------
package
comparatorTest
;
import
java.util.Comparator
;
public
class
ComparatorSort
implements
Comparator
<
Student
>
{
public
int
compare
(
Student
s1
,
Student
s2
)
{
// TODO Auto-generated method stub
if
(
s1
.
getID
()
>
s2
.
getID
())
{
return
1
;
}
else
if
(
s1
.
getID
()
<
s2
.
getID
())
{
return
-
1
;
}
else
{
if
(
s1
.
getMathScore
()
>
s2
.
getMathScore
())
return
-
1
;
else
if
(
s1
.
getMathScore
()
<
s2
.
getMathScore
())
return
1
;
else
return
0
;
}
}
}
--------------------------------------------------------------------------------
package
comparatorTest
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.Random
;
public
class
test
{
public
static
void
main
(
String
[]
args
)
{
// TODO Auto-generated method stub
Random
random
=
new
Random
();
ArrayList
<
Student
>
st
=
new
ArrayList
<
Student
>();
Student
s1
=
new
Student
(
"zhangnan1"
,
random
.
nextInt
(
10
),
random
.
nextInt
(
100
),
random
.
nextInt
(
100
));
Student
s2
=
new
Student
(
"zhangnan2"
,
random
.
nextInt
(
10
),
random
.
nextInt
(
100
),
random
.
nextInt
(
100
));
Student
s3
=
new
Student
(
"zhangnan3"
,
random
.
nextInt
(
10
),
random
.
nextInt
(
100
),
random
.
nextInt
(
100
));
Student
s4
=
new
Student
(
"zhangnan4"
,
random
.
nextInt
(
10
),
random
.
nextInt
(
100
),
random
.
nextInt
(
100
));
st
.
add
(
s1
);
st
.
add
(
s2
);
st
.
add
(
s3
);
st
.
add
(
s4
);
System
.
out
.
println
(
"所有的學生:"
);
Collections
.
sort
(
st
,
new
ComparatorSort
());
for
(
Student
s:
st
){
System
.
out
.
println
(
s
);
}
}
}
重寫的compare方法按照隨機生成的學生ID排序,其次按照數學成績排序,生成的結果是:
所有的學生:
0zhangnan3 6778
0zhangnan2 390
2zhangnan1 5796
3zhangnan4 6253
在這裏咱們沒有使用對象數組,而是使用了Collection 接口下的ArrayList 集合,因此排序用的是Collections.sort(st,new ComparatorSort())
java的比較器有兩類,分別是Comparable接口和Comparator接口。
在爲對象數組進行排序時,比較器的做用很是明顯,首先來說解Comparable接口。
讓須要進行排序的對象實現Comparable接口,重寫其中的compareTo(T o)方法,在其中定義排序規則,那麼就能夠直接調用java.util.Arrays.sort()來排序對象數組,實例以下:
- class Student implements Comparable<Student>{
- private String name;
- private int age;
- private float score;
-
- public Student(String name, int age, float score) {
- this.name = name;
- this.age = age;
- this.score = score;
- }
-
- public String toString()
- {
- return name+"\t\t"+age+"\t\t"+score;
- }
-
- @Override
- public int compareTo(Student o) {
-
- if(this.score>o.score)
- return -1;
- else if(this.score<o.score)
- return 1;
- else{
- if(this.age>o.age)
- return 1;
- else if(this.age<o.age)
- return -1;
- else
- return 0;
- }
- }
- }
-
- public class ComparableDemo01 {
-
-
-
-
- public static void main(String[] args) {
-
- Student stu[]={new Student("zhangsan",20,90.0f),
- new Student("lisi",22,90.0f),
- new Student("wangwu",20,99.0f),
- new Student("sunliu",22,100.0f)};
- java.util.Arrays.sort(stu);
- for(Student s:stu)
- {
- System.out.println(s);
- }
- }
- }
在上面的程序中,實現了Comparable接口,並重寫了compareTo方法,將學生先按成績由大到小排名,成績相同時候按照年齡由低到高排序。
執行的結果是
sunliu 22 100.0
wangwu 20 99.0
zhangsan 20 90.0
lisi 22 90.0
可是在設計類的時候,可能沒有考慮到讓類實現Comparable接口,那麼就須要用到另外的一個比較器接口Comparator。
從上面的實例咱們能夠發現,compareTo(T o)只有一個參數,而Comparator接口中必需要實現的compare(T o1,T o2)就有兩個參數。
代碼實例
- package edu.sjtu.ist.comutil;
-
- import java.util.Comparator;
-
- class Student {
- private String name;
- private int age;
- private float score;
-
- public Student(String name, int age, float score) {
- this.name = name;
- this.age = age;
- this.score = score;
- }
-
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public float getScore() {
- return score;
- }
- public void setScore(float score) {
- this.score = score;
- }
-
- public String toString()
- {
- return name+"\t\t"+age+"\t\t"+score;
- }
-
- }
-
- class StudentComparator implements Comparator<Student>{
-
- @Override
- public int compare(Student o1, Student o2) {
-
- if(o1.getScore()>o2.getScore())
- return -1;
- else if(o1.getScore()<o2.getScore())
- return 1;
- else{
- if(o1.getAge()>o2.getAge())
- return 1;
- else if(o1.getAge()<o2.getAge())
- return -1;
- else
- return 0;
- }
- }
-
- }
-
-
- public class ComparableDemo02 {
-
-
-
-
- public static void main(String[] args) {
-
-
- Student stu[]={new Student("zhangsan",20,90.0f),
- new Student("lisi",22,90.0f),
- new Student("wangwu",20,99.0f),
- new Student("sunliu",22,100.0f)};
- java.util.Arrays.sort(stu,new StudentComparator());
- for(Student s:stu)
- {
- System.out.println(s);
- }
- }
-
- }
上面依然是對student對象數組進行排序,用的都是Array.sort方法,不一樣的是實現comparator接口時,sort方法須要傳進來兩個參數,即stu對象數組,以及重寫的實現了comparator比較方法類。
程序運行的結果和上面是同樣的
Array.sort是對數組進行排序,假如咱們不想使用數組,想使用Collection接口下的集合,如想使用List,那麼須要稍微作些修改:
package comparatorTest;
/**
* 定義一個學生類
* 包括學號,姓名,數學成績,語文成績
* @author zhangnan
*
*/
public class Student{
private String Name;
private int ID;
private int scoreMath;
private int scoreChi;
public Student (String name,int ID,int score1,int score2){
this.Name=name;
this.ID=ID;
this.scoreMath=score1;
this.scoreChi=score2;
}
public String getName(){
return this.Name;
}
public void setName(String pname){
this.Name=pname;
}
public int getID(){
return this.ID;
}
public void setID(int pID){
this.ID=pID;
}
public int getMathScore(){
return scoreMath;
}
public void setMathScore(int score1){
this.scoreMath=score1;
}
public float getChiScore(){
return scoreChi;
}
public void setChiScore(int score2){
this.scoreChi=score2;
}
/**
* 返回學生信息
*/
public String toString(){
return Integer.toString(ID)+"\t\t"+Name+"\t\t"+Integer.toString(scoreMath)+"\t\t"+Integer.toString(scoreChi);
}
}
--------------------------------------------------------------------------------
package comparatorTest;
import java.util.Comparator;
public class ComparatorSort implements Comparator<Student> {
public int compare(Student s1, Student s2) {
// TODO Auto-generated method stub
if (s1.getID() > s2.getID()) {
return 1;
} else if (s1.getID() < s2.getID()) {
return -1;
} else {
if (s1.getMathScore() > s2.getMathScore())
return -1;
else if (s1.getMathScore() < s2.getMathScore())
return 1;
else
return 0;
}
}
}
--------------------------------------------------------------------------------
package comparatorTest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
public class test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Random random=new Random();
ArrayList<Student> st=new ArrayList<Student>();
Student s1= new Student("zhangnan1",random.nextInt(10),random.nextInt(100),random.nextInt(100));
Student s2= new Student("zhangnan2",random.nextInt(10),random.nextInt(100),random.nextInt(100));
Student s3= new Student("zhangnan3",random.nextInt(10),random.nextInt(100),random.nextInt(100));
Student s4= new Student("zhangnan4",random.nextInt(10),random.nextInt(100),random.nextInt(100));
st.add(s1);
st.add(s2);
st.add(s3);
st.add(s4);
System.out.println("所有的學生:");
Collections.sort(st,new ComparatorSort());
for(Student s:st){
System.out.println(s);
}
}
}
重寫的compare方法按照隨機生成的學生ID排序,其次按照數學成績排序,生成的結果是:
所有的學生:
0 zhangnan3 67 78
0 zhangnan2 39 0
2 zhangnan1 57 96
3 zhangnan4 62 53
在這裏咱們沒有使用對象數組,而是使用了Collection 接口下的ArrayList 集合,因此排序用的是Collections.sort(st,new ComparatorSort())