3

我正在實施一個處理ComparatorComparable接口的層次結構。事情是我不清楚夫婦:比較器/比較/比較器鏈接問題

  1. 如果我加入比較來比較鏈,究竟是什麼這一段代碼的意思是

    chain.addComparator(new sortByTitle());

    我知道sortByTitle()說法必須是比較器,但我不明白你如何實現這樣的功能?比較器要求您實現compare(obj1, obj2)函數,該函數使用兩個參數來比較一個參數與另一個參數,如何從單個參數(看起來像是構造函數)調用沒有參數的函數?

  2. 假設我實現了一個名爲Database的類,它在ArrayList中存儲了一些名爲item的項。變量item本身就是一個私有變量。現在,在主程序中,這樣的調用時:

    Collections.sort(library.item, chain);

    怎麼可能直接訪問對象庫的item的實例?數據庫規範規定item需要保密,這可以工作嗎?

我將不勝感激任何幫助。

回答

4
  • 正如您可能知道的那樣,Comparator本身就是一個接口。當你 說chain.addComparator(new sortByTitle());,你傳遞一個 比較器實現的實例,該比較器按標題排序對象 。在這種情況下,sortByTitle類將實施 Comparator,並將提供 compare(obj1, obj2)方法的實現。您的鏈可以在您傳入的實例上調用該實例。通常,不是每次都傳遞新實例,而是將 對象的所有Comparator實現聲明爲對象 本身的公共靜態最終成員。

例如:

public static final Comparator TITLE_COMPARATOR = new Comparator() { 
    @Override 
    public int compare(Object lhs, Object rhs) { 
     // comparison logic 
    } 
}; 

然後,您可以簡單地將它們傳遞到您以這種方式鏈條:

chain.addComparator(YourObject.TITLE_COMPARATOR); 

這具有允許比較(這是無狀態的)的添加benifit在其他地方使用,而不是每次都創建一個新實例。

  • 您需要(如果你喜歡存取函數)來寫getter和setter在圖書館類,這將使該項目的變量進行讀/其它類更新,即使它被聲明爲private。

喜歡的東西:

public List getItem() { 
    return item; 
} 

public void setItem(List item) { 
    this.item = item; 
} 
在圖書館類

+0

感謝您的幫助。 – Mike