关于“去哪网”一道笔试题解法的思考

一、笔试题的大致内容是这样:

有100万家酒店,现在需要找出前1万家酒店,根据三个指标(酒店订单量,酒店评论量,酒店访问量。优先级由大到小),即若酒店订单量相同,就比较酒店评论量,由此类推

二、解题思路

这里暂且先不考虑大数据,就考虑如何通过三个指标排序

在《Core Java》这本书的集合类中关于TreeSet有讲到,将元素添加到TreeSet中的速度,要比加到HashSet中的慢,但TreeSet会自动排序。

而排序所需要的比较器可以自己定制。所以可以通过TreeSet来存储酒店对象,然后根据题目要求定制一个比较器,通过比较器来实现在TreeSet中的排序。

三、TreeSet比较器的实现方法
通过实现Comparator接口中的compare方法来创建比较器类

public class TreeSetTest2 implements Comparator<T> {

    @Override
    public int compare(T a, T b) {
        ....
        //返回值为0,则相同
        //返回值小于0,a会放在b的前面
        //返回值大于0,a放在b的后面
    }

}

使用时,将比较器的实例对象作TreeSet的构造参数即可

TreeSetTest2 tst = new TreeSetTest2();
Set<Company> ts = new TreeSet<Company>(tst);

四、实现代码

1、首先应该建一个酒店类,如下

public class Company {
    //酒店名
    public String name;
    //订单量 
    public int order;
    //评论量
    public int comment;
    //访问量
    public int visit;

    public Company(String name, int order, int comment, int visit) {
        this.name = name;
        this.order = order;
        this.comment = comment;
        this.visit = visit;
    }
}

2、比较类

public class CompareClass implements Comparator<Company> {

    @Override
    public int compare(Company a, Company b) {
        if (a.order == b.order) {
            if (a.comment == b.comment) {
                if (a.visit == b.visit)
                    return -1;
                else
                    return a.visit > b.visit ? 20 : -1;
            } else {
                return a.comment > b.comment ? 20 : -1;
            }
        } else {
            return a.order > b.order ? 5 : -1;
        }
    }

}

3、测试用例

public class TreeSetTest {

    public static void main(String[] args) {
        CompareClass tst = new CompareClass();
        Set<Company> ts = new TreeSet<Company>(tst);
        Company c1 = new Company("酒店A", 2000, 1000, 500);
        Company c2 = new Company("酒店B", 2000, 500, 300);
        Company c3 = new Company("酒店C", 1000, 200, 700);
        Company c4 = new Company("酒店D", 2000, 1000, 500);
        Company c5 = new Company("酒店E", 3000, 1, 1);
        Company c6 = new Company("酒店F", 1, 1, 30000);
        ts.add(c1);
        ts.add(c2);
        ts.add(c3);
        ts.add(c4);
        ts.add(c5);
        ts.add(c6);

        Iterator<Company> iter = ts.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next().name);
        }

    }
}

测试结果

酒店E
酒店D
酒店A
酒店B
酒店C
酒店F
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值