1. 程式人生 > >用java中的外部比較器、內部比較器實現物件陣列的排序

用java中的外部比較器、內部比較器實現物件陣列的排序

需求:

有一個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]]