1. 程式人生 > >Java自定義實現Comparable介面的類,實現多維排序

Java自定義實現Comparable介面的類,實現多維排序

Java中提供了Arrays和Collections類能夠幫助我們來實現排序,但是前提是陣列或者集合中的元素都必須實現Comparable介面,基本的資料型別對應的類都已經實現了Comparable介面了,所以我們才能夠直接對含有基本型別的陣列和集合進行排序,大家可以看一下Integer的部分原始碼,如下:

 *
 * @author  Lee Boynton
 * @author  Arthur van Hoff
 * @author  Josh Bloch
 * @author  Joseph D. Darcy
 * @since JDK1.0
 */
public final class Integer extends Number implements Comparable<Integer> {
    /**
     * A constant holding the minimum value an {@code int} can
     * have, -2<sup>31</sup>.
     */
    public static final int   MIN_VALUE = 0x80000000;

其他的基本型別對應的類也實現了Comparable介面。

這幾天做阿里巴巴大資料比賽,想了一種比較簡單的辦法,根據使用者購買商品的數目以及商品的流行度來進行選擇使用者最感興趣的幾個產品,我定義的排序如下:

①使用者購買該商品的數目多比購買商品數目少的大

②購買的數目相同的情況下,比較商品流行度,流行度大的商品比流行度小的商品大

③以上兩者都相等,則兩商品相等

於是,我首先頂定義一個TopKBrand的類,如下:

package cn.edu.ustc.bean;

/**
 * 實現比較介面,降序排列
 * 
 * @author Yuedong Li
 * 
 */
public class TopKBrand implements Comparable<Object> {
	private int brandId; //商品id
	private int brandNumber; //商品購買數目
	private int brandPopularNumber; //商品流行度

	public TopKBrand(int brandId, int brandNumber, int brandPopularNumber) {
		super();
		this.brandId = brandId;
		this.brandNumber = brandNumber;
		this.brandPopularNumber = brandPopularNumber;
	}

	public int getBrandId() {
		return brandId;
	}

	public int getBrandNumber() {
		return brandNumber;
	}

	public int getBrandPopularNumber() {
		return brandPopularNumber;
	}

	@Override
	public int compareTo(Object o) {
		TopKBrand brand = (TopKBrand) o;
		if (brand.getBrandNumber() != this.brandNumber)
			return brand.getBrandNumber() - this.brandNumber;

		if (brand.getBrandPopularNumber() != this.brandPopularNumber)
			return brand.getBrandPopularNumber() - this.brandPopularNumber;

		return 0;
	}
}

這樣我們就可以對含TopKBrand的資料或者即和進行排序了。直接使用Arrays.sort(arr)或者Collections.sort(list) ,下面是我的使用集合的操作過程:
package cn.edu.ustc.test;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import cn.edu.ustc.bean.TopKBrand;

public class TopKBrandTest {

	public static void main(String[] args) {
		List<TopKBrand> list = new ArrayList<TopKBrand>();
		//TopKBrand引數(商品id 購買數量 流行度)
		list.add(new TopKBrand(1, 1, 1));
		list.add(new TopKBrand(1, 3, 1));
		list.add(new TopKBrand(1, 2, 2));
		list.add(new TopKBrand(1, 2, 1));
		list.add(new TopKBrand(1, 3, 3));

		Collections.sort(list);

		for (int i = 0; i < list.size(); i++) {
			TopKBrand brand = list.get(i);
			System.out.println(brand.getBrandId() + " "
					+ brand.getBrandNumber() + " "
					+ brand.getBrandPopularNumber());
		}
	}

}

輸出結果:
1 3 3
1 3 1
1 2 2
1 2 1
1 1 1

通過實現Comparable介面,我們可以實現類的多維排序,非常的方便。