2010-05-27 49 views
0

我通常這樣做是爲了一個新的地圖設置爲私有變量:如何使用另一個Map作爲值編碼Map的設置方法?

public static void setListaClausulas(Map<String, Clausula> nvLista) { 
    listaClausulas = new TreeMap<String, Clausula>(nvLista); 
} 

我想這是確定以設置nvLista,它的所有成員,而不是一個參考的新副本,是嗎?

但現在我還有一個地圖內的地圖,我這樣做:

public static void setListaClausulas(Map<String, Map<String, Clausula>> nvLista) { 
    listaClausulas = new TreeMap<String, Map<String, Clausula>>(nvLista); 
} 

這是做還是你推薦別的事情的正確方法?我想要的是設置nvLista(及其所有元素)的新副本,而不是僅複製參考。

+0

你需要克隆'Clausula'對象了,或者你可以使用舊的對象,只是複製地圖? – 2010-05-27 20:23:43

+0

我也需要複製'Clausula'對象,但這些都是照顧的,不需要擔心他們:) – 2010-05-27 22:27:51

回答

1

我想你擔心在你的方法參數中傳遞的地圖會發生變異?

您需要創建參數的深層副本。在這個SO問題中討論了各種方法,deep-clone-utility-recomendation

編輯:在迴應評論,這是一個編碼版本。這不會深入複製Clausula實例,因爲它們之前未被複制 - 我假設它們是不可變的。

public Map<String, Map<String, Clausula>> deepCopy(Map<String, Map<String, Clausula>> nvLista) 
{ 
    Map<String, Map<String, Clausula>> target = new TreeMap<String, Map<String, Clausula>>(); 
    for (String key: nvLista.keySet()) { 
     Map<String, Clausula> value = nvLista.get(key); 
     target.put(key, new TreeMap<String,Clausula>(value)); 
    } 
    return target; 
} 

但是,像這樣嵌套的集合類型很快變得不可讀。如果您可以更改代碼,則可以爲可讀性創建最內層地圖的包裝對象。

+0

我需要使用手動方法,我不能使用任何這些解決方案。那麼對於這個特定的情況,我會怎麼做呢? – 2010-05-27 20:18:38

+0

好的,答案用代碼示例更新。 – mdma 2010-05-27 20:47:16

+0

在這種特殊情況下通配符是什麼? – 2010-05-27 22:28:53

0

深複製是很難一般的情況下,但你可以做到這一點,以解決您的具體問題:

static Map< String, Map< String, Clausula > > deepCopy (
     final Map< String, Map< String, Clausula > > source 
    ) 
{ 
    final TreeMap< String, Map< String, Clausula> > result = 
     new TreeMap< String, Map<String,Clausula> >(); 

    for (
     final Map.Entry< String, Map< String, Clausula> > cur : 
      source.entrySet() 
    ) 
    { 
     result.put(
      cur.getKey(), 
      new TreeMap< String, Clausula >(cur.getValue()) 
     ); 
    } 

    return result; 
} 
相關問題