用java中的外部比較器、內部比較器實現物件陣列的排序
阿新 • • 發佈:2018-12-29
需求:
有一個People類,該類例項化的物件存放在物件陣列中。
該類的屬性有String name,int id。
請按id的大小對物件陣列中的物件進行從小到大的排序。
第一種方法:用內部比較器比較
People類如下:
/* * 為了該類的物件可以比較,實現Comparable介面,重寫compareTo方法 * 這其實就定義了一個內部比較器(在要比較的物件所在類的內部)。 */ public class People implements Comparable{ String name; int id; public People() { } public People(String name, int id) { super(); this.name = name; this.id = id; } //便於輸出物件陣列中物件的內容 public String toString() { return "People:[name="+this.name+"\t id="+this.id+"]"; } /* * 後續在排序工具類中會用到這個方法 * 該方法中定義比較規則 */ @Override public int compareTo(Object o) { People other=(People)o; return this.id-other.id; } }
排序工具類:
public class ArrayUtil { public static void sort(Object[] obj) {//屬性從小到大排 /* * 無論你傳什麼型別的物件陣列進來,只要相應類實現了 * Comparable介面,就可以將傳進來的物件陣列強轉成 * Comparable型別的物件陣列 * */ Comparable [] other=(Comparable[])obj; /* * 以下使用的是氣泡排序,氣泡排序和快速排序別搞混 */ for(int i=0;i<obj.length;i++) { for(int j=0;j<obj.length-i-1;j++) { /* * 呼叫了People類的compareTo方法 * 該類實現了Comparable介面,重寫了compareTo()方法 * 這兒運用了多型哦 */ if(other[j].compareTo(other[j+1])>0) { Comparable temp; temp=other[j]; other[j]=other[j+1]; other[j+1]=temp; } } } } }
測試類:
import java.util.Arrays; public class ArrayTest { static People []pe=new People[5]; //定義長度為5的People物件陣列 public static void main(String[] args) { /* * 通過迴圈給物件陣列傳值 * */ for(int i=0;i<pe.length;i++) { pe[i]=new People((i+1)+"nana",(i+1));//任何型別和字串拼接都會變成字串 } //呼叫排序工具類的排序方法,將一個物件陣列傳入 ArrayUtil.sort(pe); //將物件陣列中的元素轉成字串並輸出 System.out.println(Arrays.toString(pe)); } }
輸出結果:
[People:[name=1nana id=1], People:[name=2nana id=2], People:[name=3nana id=3], People:[name=4nana id=4], People:[name=5nana id=5]]
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第二種方法:利用外部比較器比較
注意:既然是外部比較器,那比較器就是定義在People類外部,故People類不需要因為比較器的原因新增任何程式碼
People類:
public class People{
String name;
int id;
public People() {
}
public People(String name, int id) {
super();
this.name = name;
this.id = id;
}
//便於輸出物件陣列中物件的內容
public String toString() {
return "People:[name="+this.name+"\t id="+this.id+"]";
}
}
比較器類:
import java.util.Comparator;
/*
* 定義的比較器類需要實現Comparator介面,重寫compare方法
*
* 記憶訣竅:
* 內部比較器 Comparable介面 compareTo(Object o) 定義在要比較的物件所屬類的內部
* 外部比較器 Comparator介面 compare(Object o1,Object o2) 寫一個比較器類
*/
public class bijiaoqi implements Comparator {
/*
* 重寫Comparator介面的compare方法
* 定義比較規則
*/
@Override
public int compare(Object o1, Object o2) {
People pe1=(People)o1;
People pe2=(People)o2;
return pe1.id-pe2.id;
}
}
排序工具類:
import java.util.Comparator;
public class ArrayUtil {
/*
* 方法接收一個物件陣列和一個比較器
*/
public static void sort(Object[] obj,Comparator com) {
/*
* 以下使用的是氣泡排序的演算法
*/
for(int i=0;i<obj.length;i++) {
for(int j=0;j<obj.length-i-1;j++) {
/*
*此處呼叫了比較器重寫的compare方法
*/
if(com.compare(obj[j],obj[j+1])>0) {
Object temp;
temp=obj[j];
obj[j]=obj[j+1];
obj[j+1]=temp;
}
}
}
}
}
測試類:
import java.util.Arrays;
public class ArrayTest {
static People []pe=new People[5]; //定義長度為5的People物件陣列
public static void main(String[] args) {
/*
* 通過迴圈給物件陣列傳值
*
*/
for(int i=0;i<pe.length;i++) {
pe[i]=new People((i+1)+"nana",(i+1));//
}
//呼叫排序工具類的排序方法,將一個物件陣列和比較器傳入排序工具類的sort方法
ArrayUtil.sort(pe,new bijiaoqi());
//將物件陣列中的元素轉成字串並輸出
System.out.println(Arrays.toString(pe));
}
}
執行結果:
[People:[name=1nana id=1], People:[name=2nana id=2], People:[name=3nana id=3], People:[name=4nana id=4], People:[name=5nana id=5]]
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
第三種方式:利用外部比較器加匿名內部類實現
解析:由於比較器類只用一次,故我們可以在測試類中建立一個比較器的匿名內部類,以下這種方法的程式碼People類、排序工具類完全一致
People類:
public class People{
String name;
int id;
public People() {
}
public People(String name, int id) {
super();
this.name = name;
this.id = id;
}
//便於輸出物件陣列中物件的內容
public String toString() {
return "People:[name="+this.name+"\t id="+this.id+"]";
}
}
排序工具類:
import java.util.Comparator;
public class ArrayUtil {
/*
* 方法接收一個物件陣列和一個比較器
*/
public static void sort(Object[] obj,Comparator com) {
/*
* 以下使用的是氣泡排序的演算法
*/
for(int i=0;i<obj.length;i++) {
for(int j=0;j<obj.length-i-1;j++) {
/*
*此處呼叫了比較器重寫的compare方法
*/
if(com.compare(obj[j],obj[j+1])>0) {
Object temp;
temp=obj[j];
obj[j]=obj[j+1];
obj[j+1]=temp;
}
}
}
}
}
測試類:
import java.util.Arrays;
import java.util.Comparator;
public class ArrayTest {
static People []pe=new People[5]; //定義長度為5的People物件陣列
public static void main(String[] args) {
/*
* 通過迴圈給物件陣列傳值
*
*/
for(int i=0;i<pe.length;i++) {
pe[i]=new People((i+1)+"nana",(i+1));//
}
//呼叫排序工具類的排序方法,將一個物件陣列和比較器傳入排序工具類的sort方法
//使用Comparator介面例項化一個匿名內部類
ArrayUtil.sort(pe,new Comparator() {
@Override
public int compare(Object o1, Object o2) {
People pe1=(People)o1;
People pe2=(People)o2;
return pe1.id-pe2.id;//比較規則
}
});
//將物件陣列中的元素轉成字串並輸出
System.out.println(Arrays.toString(pe));
}
}
執行效果:
[People:[name=1nana id=1], People:[name=2nana id=2], People:[name=3nana id=3], People:[name=4nana id=4], People:[name=5nana id=5]]