2012-07-17 30 views
0

我剛剛開始使用FunctionalJava庫並希望使用不可變的TreeMap。但是我無法弄清楚如何在使用用戶定義的類或接口時創建一個空的。如何構建一個FunctionalJava TreeMap?

fj.data.TreeMap<IAddress, Optional<ScanNode>> nodes = TreeMap.empty(Ord<IAddress>); 

所有示例都使用預定義類型,如Ord.stringOrd。我完全不瞭解如何創建適當的Ord < IAddress>。

有人可以解釋如何做到這一點?

謝謝,德里克

回答

3

基本上是一個樹形圖必須有某種對其元素進行排序的,所以你必須說明如何訂購您IAddress。

的例子,可以說IAddress有2個字符串和一個int(市,街道,號碼),你可以做到以下幾點:

// translate an IAddress to a P3 containing the important data 
F<IAddress, P3<String, String, Integer>> toP3 = new F<...>() { 
     P3<String, String, Integer> f(IAddress addr) { 
       return P.p(addr.getCity(), addr.getStreet(), addr.getNumber()); 
} 

main() { 
    // first map IAddress to a P3 using the function above, then simply order it by its fields 
    Ord<IAddress> addrOrd = Ord.P3Ord(Ord.StringOrd, Ord.StringOrd, Ord.IntOrd).comap(toP3); 

    fj.data.TreeMap<IAddress, Optional<ScanNode>> nodes = TreeMap.empty(addrOrd); 
} 

共同映射意味着率先應用功能TOP3的IAddress ,取回P3,然後用給定的P3訂單進行訂購。

+0

當然,如果你不介意訂購,你可以隨時使用像Ord這樣的東西。 hashOrd()或Ord。 hashEqualsOrd() – Shlomi 2012-07-18 07:40:08

+0

哇,這是相當醜陋的看看。我沒有在文檔中看到任何關於hashOrd()或hashEqualsOrd()的提及。它們可能足以滿足我的需求。 – 2012-07-18 15:58:56

+1

TreeMap非常有用,因爲它可以讓您對數據進行有序迭代。如果你不需要這個,你最好使用HashMap – ron 2012-07-26 12:32:18

0

如果IAddress執行Comparable,您也可以使用Ord.<IAddress>comparableOrd()爲它構建一個Ord