2014-06-26 3 views
2

J'ai un HashSet de MyObject que j'ai besoin de cloner. Si MyObject implémente une copie-constructeur, ce qui est le plus facile, neatest moyen de cloner Set myObjectsJava: Comment cloner en profondeur un HashSet?

Il est évident que je pouvais faire quelque chose comme:

Set<MyObject> myNewObjects = new Set<MyObject>(); 
for(MyObject obj: myObjects) myNewObjects.add(new MyObject(obj)); 

Mais je fais cela dans le cadre d'une looooooongues copie construcotr , et je voudrais vraiment être en mesure de le faire en une ligne comme:

public myClass(MyClass toClone){ 
    //... 
    this.myObjects = new Set<MyObjects>(toClone.getmyObjects()); 
    //... 
} 

Des suggestions?

+0

Il existe également une interface Clonable que vous pouvez utiliser. –

+0

Salut David, tous les articles que j'ai rencontrés m'avaient fortement déconseillé d'utiliser clone(), car sa mise en œuvre est intrinsèquement brisée ... êtes-vous en désaccord ou est-ce juste un FYI? – Paul

+0

Vous pouvez toujours remplacer le clone, mais oui, il est un peu cassé par défaut. –

Répondre

3

Vous pouvez utiliser pour faire quelque chose comme de Google Goyave Iterables ceci:

Set<MyObject> newSet = new HashSet<MyObject>(
    Iterables.transform(myObjects,new Function<MyObject, MyObject>() { 
    @Override 
    public MyObject apply(MyObject input) { 
     return new MyObject(input); 
    } 
    })); 

Ou si vous voulez utiliser immuable Guava's immutable set:

Set<MyObject> newSet = ImmutableSet.copyOf(
    Iterables.transform(myObjects,new Function<MyObject, MyObject>() { 
    @Override 
    public MyObject apply(MyObject input) { 
     return new MyObject(input); 
    } 
    })); 

Malheureusement, il ne soit pas plus compact que ce que vous Vous pouvez déjà utiliser Java 8.

+0

@Paul a demandé une copie profonde. –

+0

@DavidEhrmann et ce qui précède est à la place? –

+0

Salut Giovanni, j'avais l'impression que le constructeur HashSet Copy me donnerait une copie superficielle? Je veux dire, ça ne va pas appeler les constructeurs de copie de chaque élément dans l'ensemble? – Paul

7

Si vous utilisez Java 8, vous pouvez faire quelque chose comme ceci:

Set<MyObject> set1 = new HashSet<>(); 
Set<MyObject> set2 = set1.stream().map(MyObject::new).collect(Collectors.toSet()); 

Gardez à l'esprit, cependant, que l'utilisation Collectors.toSet():

Il n'y a aucune garantie sur le type, la mutabilité, sérialisation, ou fil de sécurité de l'ensemble renvoyé

Bien courant implémentation dans Java 8 Update 5 utilise HashSet standard.

+0

Java 6 système hérité :( – Paul

+0

+1 pour de nouvelles informations –

0
Set<MyObject> set = new HashSet<>(); 
     for (MyObject value : myHash) { 
      set.add(value.copy()); 
     } 

value.copy() est la fonction que cloner votre objet (vous devez créer une méthode comme cela et créer un nouvel objet et affecter les champs en conséquence de rendre le travail de clonage profond.).

Questions connexes