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接口,我们可以实现类的多维排序,非常的方便。

参与评论