### 自定義的類User:
~~~
package com.example.testcomparator;
public class User{
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return "name:"+name+"--age:"+age;
}
}
~~~
當我們有一組User對象組合時,我們要對其中的User對象排序,優先對name排序,如果name一樣,則再依據age排序。
### 1.使用Comparator接口來排序:
~~~
package com.example.testcomparator;
import java.util.Comparator;
//先比較id,再比較age
public class UserComparator implements Comparator<User>{
@Override
public int compare(User user0, User user1) {
// TODO Auto-generated method stub
int flag = 0;
flag = user0.getName().compareTo(user1.getName());
if(flag == 0) { // 如果id一樣,比較年齡, 返回比較年齡結果
return user0.getAge() - user1.getAge();
} else {
return flag; // 名字不一樣, 返回比較id的結果.
}
}
}
~~~
排序方法,我們分別對List和數組來分別排序:
(1)List排序:
~~~
List userList = new ArrayList<User>();
userList.add(new User("a",5));
userList.add(new User("c",6));
userList.add(new User("a",4));
userList.add(new User("b",2));
userList.add(new User("b",3));
userList.add(new User("c",7));
for(int i = 0;i<userList.size();i++){
Log.i(TAG, "排序前:"+userList.get(i));
}
Collections.sort(userList, new UserComparator());
for(int i = 0;i<userList.size();i++){
Log.i(TAG, "排序后:"+userList.get(i));
}
~~~
(2)對數組排序:
~~~
User[] userArray = new User[]{
new User("a", 5),
new User("c", 6),
new User("a", 4),
new User("b", 2),
new User("b", 3),
new User("c", 7)};
for(int i = 0;i<userArray.length;i++){
Log.i(TAG, "排序前:"+userArray[i]);
}
Arrays.sort(userArray,new UserComparator());
for(int i = 0;i<userArray.length;i++){
Log.i(TAG, "排序后:"+userArray[i]);
}
~~~
輸出結果:
排序前:name:a--age:5
排序前:name:c--age:6
排序前:name:a--age:4
排序前:name:b--age:2
排序前:name:b--age:3
排序前:name:c--age:7
排序后:name:a--age:4
排序后:name:a--age:5
排序后:name:b--age:2
排序后:name:b--age:3
排序后:name:c--age:6
排序后:name:c--age:7
### 2.使用Comparable接口來排序:
先要改造User類:
~~~
package com.example.testcomparator;
public class User implements Comparable<Object>{
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return "name:"+name+"--age:"+age;
}
@Override
//先比較id,id相同后再比較age
public int compareTo(Object object) {
// TODO Auto-generated method stub
int flag = 0;
flag = name.compareTo(((User)object).getName()); // 使用字符串的比較
if(flag == 0) { // 如果id一樣,比較年齡, 返回比較年齡結果
return age - ((User)object).getAge();
} else {
return flag; // 名字不一樣, 返回比較id的結果.
}
}
}
~~~
(1)List排序:
~~~
List userList = new ArrayList<User>();
userList.add(new User("a",5));
userList.add(new User("c",6));
userList.add(new User("a",4));
userList.add(new User("b",2));
userList.add(new User("b",3));
userList.add(new User("c",7));
for(int i = 0;i<userList.size();i++){
Log.i(TAG, "排序前:"+userList.get(i));
}
Collections.sort(userList);
for(int i = 0;i<userList.size();i++){
Log.i(TAG, "排序后:"+userList.get(i));
}
~~~
(2)對數組排序:
~~~
User[] userArray = new User[]{
new User("a", 5),
new User("c", 6),
new User("a", 4),
new User("b", 2),
new User("b", 3),
new User("c", 7)};
for(int i = 0;i<userArray.length;i++){
Log.i(TAG, "排序前:"+userArray[i]);
}
Arrays.sort(userArray);
for(int i = 0;i<userArray.length;i++){
Log.i(TAG, "排序后:"+userArray[i]);
}
~~~
輸出結果:
排序前:name:a--age:5
排序前:name:c--age:6
排序前:name:a--age:4
排序前:name:b--age:2
排序前:name:b--age:3
排序前:name:c--age:7
排序后:name:a--age:4
排序后:name:a--age:5
排序后:name:b--age:2
排序后:name:b--age:3
排序后:name:c--age:6
排序后:name:c--age:7
### 3.總結:
comparable ? Comparator 都是用來實現集合中的排序的。
Comparable是在集合內部定義的方法實現的排序,
Comparator是在集合外部實現的排序,
所以,如想實現排序,就需要在集合外定義Comparator接口的方法compare()或在集合內實現Comparable接口的方法compareTo()。
兩種方法各有優劣:
?用Comparable 簡單, 只要實現Comparable 接口的對象直接就成為一個可以比較的對象,但是需要修改源代碼。
用Comparator 的好處是不需要修改源代碼, 而是另外實現一個比較器, 當某個自定義的對象需要作比較的時候,把比較器和對象一起傳遞過去就可以比大小了,?
并且在Comparator 里面用戶可以自己實現復雜的可以通用的邏輯,使其可以匹配一些比較簡單的對象,那樣就可以節省很多重復勞動了。
用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行為,所以,我們推薦使用Comparator.
### 4.參考資料:
1.Comparator和Comparable在排序中的應用
[http://www.blogjava.net/fastunit/archive/2008/04/08/191533.html](http://www.blogjava.net/fastunit/archive/2008/04/08/191533.html)
2.Java中,如果想要排序,實現Comparator接口 //與Comparable 的區別?
[http://zhidao.baidu.com/link?url=54BbyjAWPv5pG3l9c_ww0-4vPPdQSZ6FZ6u-yJAh52bJwXRRyTPN9iUUvpUYzKOMBLhl80Po2qfBI4Vipansh_](http://zhidao.baidu.com/link?url=54BbyjAWPv5pG3l9c_ww0-4vPPdQSZ6FZ6u-yJAh52bJwXRRyTPN9iUUvpUYzKOMBLhl80Po2qfBI4Vipansh_)
- 前言
- Java核心技術之Comparator和Comparable在排序中的應用
- Java核心技術之容器
- Java核心技術之基本數據類型
- java核心技術之正則表達式
- java核心技術之reflect(一):一個系統學習reflect的Demo(精)
- java核心技術之IO流(一)File類
- java核心技術之IO流(二)FileInputStream和FileOutputStream
- java核心技術之IO流(三)FileReader和FileWriter
- java核心技術之IO流(四)BufferedInputStream和BufferedOutputStream
- java核心技術之IO流(五)BufferedReader和BufferedWriter
- java核心技術之IO流(六)DataInputStream和DataOutputStream