2013-03-08 46 views
1

請考慮以下情況:訪問地圖映射的最佳方式

我有一個使用String作爲鍵和另一個Map作爲值的映射。現在,該值中的地圖也是以String作爲關鍵字和Map作爲值的Map。我們有一些像這樣的n個級別,最終級別有一個Map作爲鍵,String作爲一個值。現在假設,我有每個級別的鍵列表。我必須得到最終的字符串值。

這是我已經想實現它在Java:

Object q = initialMap; 
for(String key : keyList) 
{ 
    Map x = (Map)q; 
    q = x.get(key); 
} 
return (String)q; 

這是解決這個正確的方式?我收到了未經檢查的轉換警告。有沒有更好的方法來做到這一點?

+1

使用迭代器很常見。 – 2013-03-08 18:23:05

+1

你可以改變嵌套的地圖設計嗎?還是來自另一個圖書館? – bowmore 2013-03-08 18:23:57

+0

是固定的,它來自另一個庫 – prashanthkvs 2013-03-08 18:24:29

回答

1

我想我明白你的問題,你從一個文件中的地圖字符串到字符串映射到地圖......等事情是這樣獲得:

Map<String, Map<String, Map<String, Map<String, String>>>> initialMap; 

什麼是不是在你的問題明確如果你知道會有多少層次的地圖。如果是的話,那麼就像我剛纔那樣寫你的初始地圖(對於4級地圖)就可以得到你需要的層數。

如果您事先並不知道您有多少水平,那麼這就更難了。在那種情況下,你的算法是健全的。我只會使其更加仿製藥是這樣的:

Object q = initialMap; 
for(String key : keyList) 
{ 
    Map<String, ?> x = (Map<String, ?>)q; 
    q = x.get(key); 
} 
return (String)q; 

但是,這將永遠給你一個警告,那你將有增加@SuppressWarnings壓制(「未登記」)的方法。

你可以嘗試在一種方法中抽象這個。

編輯:有一種方法可以在工具類中完全抽象它。我會打電話給你想要的一種遞歸地圖。您的任何Map都是從String到String的映射,或者是映射到String到遞歸映射的映射。這可以被抽象這樣:

interface IRecursiveMap { 
    String get(List<String> keyList); 
} 

class RecursiveMap implements IRecursiveMap{ 
    Map<String, IRecursiveMap> map; 

    @Override 
    public String get(List<String> keyList) { 
    String key = keyList.get(0); 
    return map.get(key).get(keyList.subList(1, keyList.size())); 
    } 
} 

class ValueMap implements IRecursiveMap{ 
    Map<String, String> map; 

    @Override 
    public String get(List<String> keyList) { 
    String key = keyList.get(0); 
    return map.get(key); 
    } 
} 

所以IRecursiveMap是定義你的地圖的共同行爲的界面:從密鑰列表得到的東西的能力。 RecursiveMap是將String映射到另一個IRecursiveMap的實現,ValueMap是遞歸的最後一個映射,它實際上將String映射到String。

在執行好是:

  • 該代碼使用泛型正常和數據完全打出來。這意味着你沒有更多的通用警告。
  • 所有在這個地圖鏈中存儲東西的邏輯都被抽象爲幾個實用類。

另一方面,缺點是填充地圖可能有點複雜,但它也可以遞歸地完成。

相關問題