142 votes

Copier une table de hachage en Java

J'essaie de conserver un conteneur temporaire d'une classe qui contient des membres :

HashMap<Integer,myObject> myobjectHashMap

Une classe appelée myobjectsList

Ensuite, je le fais

myobjectsListA = new myobjectsList();
myobjectsListB = new myobjectsList();

ensuite : Ajouter quelques éléments hashmap à A (comme 2)

ensuite :

myobjectListB = myobjectListA; //B has 2

ensuite : Ajouter des éléments hashmap à A (comme 4 de plus)

ensuite : renvoyer A aux éléments stockés dans B

myobjectListA = myobjectListb;

Mais lorsque je fais cela, B grandit avec A alors que j'ajoute des éléments hashmap à A. A contient maintenant 6 éléments parce que B en avait 6.

Je veux que A ait toujours les 2 originaux à la fin après la dernière affectation. En C++, j'utiliserais copy avec des objets, quel est l'équivalent en Java ?

Ajouté : OK, j'ai oublié quelque chose dans l'explication. MyObjectsList ne contient pas de HashMap, il est dérivé d'une classe MyBaseOjbectsList qui possède le membre HashMap et MyObjectsList s'étend MyBaseOjbectsList . Cela fait-il une différence ?

268voto

ratchet freak Points 22412

Si vous voulez une copie de la table de hachage, vous devez en construire une nouvelle avec.

myobjectListB = new HashMap<Integer,myObject>(myobjectListA);

Cela créera une copie (peu profonde) de la carte.

17voto

user2236292 Points 74

Vous pouvez également utiliser

clone()

Méthode pour copier tous les éléments d'une hashmap vers une autre hashmap

Programme permettant de copier tous les éléments d'une hashmap vers une autre

import java.util.HashMap;

public class CloneHashMap {    
     public static void main(String a[]) {    
        HashMap hashMap = new HashMap();    
        HashMap hashMap1 = new HashMap();    
        hashMap.put(1, "One");
        hashMap.put(2, "Two");
        hashMap.put(3, "Three");
        System.out.println("Original HashMap : " + hashMap);
        hashMap1 = (HashMap) hashMap.clone();
        System.out.println("Copied HashMap : " + hashMap1);    
    }    
}

source : http://www.tutorialdata.com/examples/java/collection-framework/hashmap/copy-all-elements-from-one-hashmap-to-another

14voto

ControlAltDel Points 7430

La différence est qu'en C++, votre objet se trouve sur la pile, alors qu'en Java, votre objet se trouve dans le tas. Si A et B sont des objets, à tout moment en Java vous faites :

B = A

A et B pointent vers le même objet, donc tout ce que vous faites à A, vous le faites à B et vice versa.

Utiliser de nouvelles HashMap() si vous voulez deux objets différents.

Et vous pouvez utiliser Map.putAll(...) pour copier des données entre deux cartes.

8voto

xuesheng Points 541

Depuis Java 10, il est possible d'utiliser

Map.copyOf

pour la création d'un copie superficielle qui est également immuable. (Voici son Javadoc ). Pour un copie approfondie , comme indiqué dans le présent document. répondre vous avez besoin d'une sorte de mappeur de valeurs pour faire une copie sûre des valeurs. Il n'est pas nécessaire de copier clés cependant, puisqu'ils doivent être immuable .

6voto

murt Points 1283

Il s'agit d'un petit (énorme) euphémisme. Si vous voulez copier un HashMap avec des structures imbriquées, HashMap.putAll() copiera par référence, parce qu'il ne sait pas comment copier exactement votre objet. Par exemple :

import java.util.*;
class Playground {
    public static void main(String[ ] args) {
        Map<Integer, Map<Integer,List<Float>>> dataA = new HashMap<>();
        Map<Integer, Map<Integer,List<Float>>> dataB = new HashMap<>();

        dataA.put(1, new HashMap<>());
        dataB.putAll(dataA);

        assert(dataB.get(1).size() == 0);

        dataA.get(1).put(2, new ArrayList<>());

        if (dataB.get(1).size() == 1) { // true
            System.out.println(
                "Sorry object reference was copied - not the values");
        }
    }
}

Vous devrez donc copier les champs vous-même, comme suit

List <Float> aX = new ArrayList<>(accelerometerReadingsX);
List <Float> aY = new ArrayList<>(accelerometerReadingsY);

List <Float> gX = new ArrayList<>(gyroscopeReadingsX);
List <Float> gY = new ArrayList<>(gyroscopeReadingsY);

Map<Integer, Map<Integer, Float>> readings = new HashMap<>();

Map<Integer,List<Float>> accelerometerReadings = new HashMap<>();
accelerometerReadings.put(X_axis, aX);
accelerometerReadings.put(Y_axis, aY);
readings.put(Sensor.TYPE_ACCELEROMETER, accelerometerReadings);

Map<Integer,List<Float>> gyroscopeReadings = new HashMap<>();
gyroscopeReadings.put(X_axis, gX);
gyroscopeReadings.put(Y_axis, gY);
readings.put(Sensor.TYPE_GYROSCOPE, gyroscopeReadings);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X