一、筆試題的大致內容是這樣:
有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