天天看點

說說java對象排序

      在集合或者數組中,有時候需要對裡面的元素,也就是對象進行排序,依照對象的某個或者某幾個屬性從大到小或者從小到大進行排序,我們可以采用直接編碼的方式,将集合或者數組中的元素進行重新排列,但,采用java本身提供的接口,無疑是一種更有效的方法。

      java提供兩種方式來提供比較功能。第一種是實作java.lang.Comparable接口,它有一個 int compareTo(Object o)方法,重寫此方法即可。

package compare;

public class People implements Comparable {
	private int id;
	private String name;

	public People(int id,String name){
		this.id=id;
		this.name=name;
	}
	/*
	 * 這裡表示按id從小到大排序,如果該對象小于、等于或大于指定對象Object o,則分别傳回負整數、零或正整數
	 * 如果需要從大到小排序,則如果該對象小于、等于或大于指定對象Object o,則分别傳回正整數、零或負整數
	 * @see java.lang.Comparable#compareTo(java.lang.Object)
	 */
	public int compareTo(Object o) {
		People people=(People)o;
		if(id<people.getId()){
			return -1;
		}
		if(id>people.getId()){
			return 1;
		}
		return 0;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
           

 測試代碼如下:

List peopleList = new ArrayList();
		peopleList.add(new People(2, "張三"));
		peopleList.add(new People(1, "李四"));
		peopleList.add(new People(0, "王五"));
		System.out.println("排序前");
		for (int i = 0; i < peopleList.size(); i++) {
			People people = (People) peopleList.get(i);
			System.out.println(people.getId() + " " + people.getName());
		}
		Collections.sort(peopleList);
		System.out.println("排序後");
		for (int i = 0; i < peopleList.size(); i++) {
			People people = (People) peopleList.get(i);
			System.out.println(people.getId() + " " + people.getName());
		}
           

 以下是輸出結果:

排序前
2 張三
1 李四
0 王五
排序後
0 王五
1 李四
2 張三
           

 另一種方式是實作java.util.Comparator接口,重寫int compare(Object o1, Object o2)方法即可。

package compare;

import java.util.Comparator;

public class Compare implements Comparator {

	/* 
	 * 這裡表示按id從小到大排序,如果該對象o1小于、等于或大于指定對象o2,則分别傳回負整數、零或正整數
	 * 如果需要從大到小排序,則如果對象o1小于、等于或大于指定對象o2,則分别傳回正整數、零或負整數
	 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
	 */
	public int compare(Object o1, Object o2) {
		Student s1=(Student)o1;
		Student s2=(Student)o2;
		if(s1.getId()<s2.getId()){
			return -1;
		}
		if(s1.getId()>s2.getId()){
			return 1;
		}
		return 0;
	}
}
           

 Student類代碼如下:

package compare;

public class Student {
	private int id;
	private String name;

	public Student(int id, String name) {
		this.id = id;
		this.name = name;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}
           

 測試代碼如下:

List<Student> list = new ArrayList<Student>();
		Student s1 = new Student(1, "a");
		Student s2 = new Student(2, "b");
		Student s3 = new Student(3, "c");

		list.add(s3);
		list.add(s2);
		list.add(s1);

		System.out.println("排序前");
		for (int i = 0; i < list.size(); i++) {
			Student s = list.get(i);
			System.out.println(s.getId() + " " + s.getName());
		}
		Collections.sort(list, new Compare());
		System.out.println("排序後");
		for (int i = 0; i < list.size(); i++) {
			Student s = list.get(i);
			System.out.println(s.getId() + " " + s.getName());
		}
           

 結果如下:

排序前
3 c
2 b
1 a
排序後
1 a
2 b
3 c
           

 結果和預期是相同的。

這兩種方法都可以實作按照對象的屬性進行排序,或者自己定義排序規則,不過個人更傾向于使用第二種方式,因為這種方式對JavaBean不進行任何的修改,而且擴充起來也很友善