關於“去哪網”一道筆試題解法的思考

一、筆試題的大致內容是這樣:

有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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章