2010-05-27 3 views
0

Normalement, je ne ceci pour définir une nouvelle carte à une variable privée:Comment coder la méthode set d'une Map avec une autre Map comme valeur?

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

Je suppose que cela est autorisé à définir une nouvelle copie du nvLista et tous ses membres et non une référence, est-il?

Mais maintenant j'ai une carte dans une autre carte et je fais ceci:

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

Est-ce la bonne façon de le faire ou recommandez-vous autre chose? Ce que je veux est de mettre une nouvelle copie de nvLista (et tous ses éléments) et ne pas copier seulement la référence.

+0

Avez-vous besoin de cloner le 'Clausula' aussi des objets, ou pouvez-vous simplement utiliser les objets anciens, et simplement copier les cartes? –

+0

J'ai aussi besoin de copier les objets 'Clausula' mais ils sont pris en charge, pas besoin de m'en faire pour moi :) –

Répondre

1

Je suppose que vous êtes inquiet au sujet des cartes passées dans votre paramètre de méthode sera muté?

Vous devez créer une copie en profondeur du paramètre. Diverses approches sont discutées dans cette question SO, deep-clone-utility-recomendation

EDIT: En réponse au commentaire, voici une version codée. Cela ne copie pas en profondeur les instances Clausula, puisqu'elles n'ont pas été copiées auparavant - je suppose qu'elles sont immuables.

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; 
} 

Toutefois, l'imbrication de types de collection de ce type devient rapidement illisible. Si vous pouvez modifier le code, il peut être utile de créer un objet wrapper pour la carte la plus interne.

+0

Je dois utiliser une approche manuelle et je ne peux utiliser aucune de ces solutions. Comment ferais-je alors pour ce cas particulier? –

+0

Ok, réponse mise à jour avec un échantillon de code. – mdma

+0

Quel est le caractère générique pour dans cette situation particulière? –

0

copie en profondeur est difficile pour le cas général, mais vous pouvez faire pour résoudre votre problème:

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; 
}