一、笔试题的大致内容是这样:
有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