歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

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接口,我們可以實現類的多維排序,非常的方便。

Copyright © Linux教程網 All Rights Reserved