2016-04-21 92 views
1

例如,是它總體上是好的有如下的結構:在java中使用映射作爲值的映射是「好」嗎?

Map <Object, Map> 

在我的情況,乍一看我需要某種結構,將有例如映射String -> Map<...>這很奇怪,我應該以其他方式解決問題?

+1

取決於你的用例。它不一定是錯的。 – khelwood

+0

任何地方都可以使用[原始類型](https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html)。至少,使它成爲'Map >'。 –

+0

我不問行類型,而是關於有一個地圖作爲價值。 使用案例:我有一些開關,例如JComboBox,我需要一個單獨的地圖關聯到列表中的每個對象,所以如果我選擇一些相應的地圖將被使用。 –

回答

2

以這種方式設計數據結構本身並不好。這也不一定是壞事。

如果您要查找地圖對象,我會考慮使用HashMap來提高執行時間。

來自@Rafael Osipov,在涉及併發性的情況下,考慮使用ConcurrentHashMap來實現數據完整性。

+0

這個'HashMap'提示是什麼?這完全不相關,可能「不好」...... – Marco13

+0

其實HashMap是一個Map的非標準實現。在實踐項目中,你幾乎看不到別的東西。是的,問題不是關於它的 –

+0

如果實現涉及併發性,請考慮在HashMap上使用'ConcurrentHashMap'來獲得性能增益。 – 2016-04-21 12:59:51

0

將地圖作爲地圖中的值沒有什麼不對。這是使用多個鍵快速查找的一種相當常見的方式。

例如,你存儲大量的Student記錄:

class Student 
    private String name; 
    private int age; 
    private School school; 
} 

您可以將這些存儲在List<Student>,但如果你想找到,比如,所有的學生在一定的學校誰16歲老它可能是更好的能說:

Map<School,Map<Integer,List<Student>>> index; 
List<Student> subset = index.get(School.STATE_HIGH).get(16); 

注意,有諸如具有獨立的複合鍵類型(在我上面的例子,代表學校和年齡一起)做同樣的事情的其他方式。另外請記住,如果您使用地圖的主要目的是效率,那麼在很多情況下,您可能會過早地進行優化。除非地圖存儲了數百萬個值,否則你將每秒訪問它們幾千次,那麼你可能需要考慮一個簡單的列表,你可以通過它來搜索。

2

它有幾個代碼味道對我來說。

  1. 內部Map沒有指定通用類型。
  2. 它說你需要做兩次查找。我更喜歡在拼合地圖上使用複合鍵和單個查找。
  3. 添加到此結構中必須過於複雜。
  4. 關鍵是object,不是強類型。

所以我寧願看到:

Map<CompositeKey, ValueType> 

哪裏CompositeKey是由第一和第二項的正確實施的平等一類。和ValueType不是Map

因此,例如,代替嵌套地圖:

A -> { 1 -> "ABC", 
     2 -> "DEF"}, 
B -> { 1 -> "abc", 
     3 -> "def"} 

你有一個平坦的地圖和一個複合鍵:

(A,1) -> "ABC", 
(A,2) -> "DEF", 
(B,1) -> "abc", 
(B,3) -> "def",