HashMap mit Inhalt kopieren

drAb17

Mitglied
Hallo zusammen. ich stehe gerade vor einem Problem, dass ich nicht lösen kann. ich möchte eine HashMap mit ihrem Inhalt kopieren. Und zwar nicht nur die Map, sondern auch die Objekte in ihr. Ich habe es mit putAll() versucht, jedoch kopiert er nur die Map, die Referenzen auf die Objekte sind die selben.
Hier das was ich versucht habe:

Java:
import java.util.HashMap;


class HashMapExample {

	public static void main(String args[]) {

		HashMap<String, Person> hm = new HashMap<String, Person>();
		hm.put("1", new Person("ich", 100d));

		
		HashMap<String, Person> copyMap = new HashMap<String, Person>();
		
		copyMap.putAll(hm); //???????????????

		Person pers = hm.get("1");
		pers.setChash(-50d);
		
		
		System.out.println(hm.get("1").getChash());
		System.out.println(copyMap.get("1").getChash());
	
	}
}
und die Personen Klasse
Java:
public class Person {
	private String name;
	private double chash;
	
	public Person(String name, double chash) {
		super();
		this.name = name;
		this.chash = chash;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getChash() {
		return chash;
	}
	public void setChash(double chash) {
		this.chash = chash;
	}
	
}
 

nrg

Top Contributor
überschreib in Person die clone methode und dann erstelle eine deepcopy der map. wenn ich mich nicht irre, erzeugt hm.clone() lediglich eine shallow copy. um eine dc zu erstellen, musste imho durch die inputmap iterieren und jedes objekt einzeln clonen.
 

drAb17

Mitglied
OK, habe ich nun so gelöst. jedoch denke ich, dass man dies einfacher lösen kann und auch eleganter????? habt ihr ideen? danke !

Java:
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

class HashMapExample {

	public static void main(String args[]) {

		HashMap<String, Person> hm = new HashMap<String, Person>();
		hm.put("1", new Person("ich", 100d));

		

		HashMap<String, Person> newMap = copyMap(hm);

		Person pers = hm.get("1");
		pers.setChash(-100d);
		
		System.out.println(hm.get("1").getChash());
		System.out.println(newMap.get("1").getChash());
	
	}
	
	private static HashMap<String, Person> copyMap(HashMap<String, Person> map){
		HashMap<String, Person> copyMap = new HashMap<String, Person>();
		
		Set<Entry<String, Person>> set = map.entrySet();
		Iterator<Entry<String, Person>> iter = set.iterator();
		
		while (iter.hasNext()){
			
			Map.Entry<String, Person> me = (Map.Entry<String, Person>) iter.next(); 
			try {
				copyMap.put(me.getKey(), (Person) me.getValue().clone());
			} catch (CloneNotSupportedException e) {
				e.printStackTrace();
			}
		}
		return copyMap;
	}
}
Java:
public class Person implements Cloneable{
	private String name;
	private double chash;
	
	public Person(String name, double chash)  {
		super();
		this.name = name;
		this.chash = chash;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public double getChash() {
		return chash;
	}
	public void setChash(double chash) {
		this.chash = chash;
	}
	
	@Override
	protected Object clone() throws CloneNotSupportedException{
			return (Person) super.clone();
	}

}
 
G

Gelöschtes Mitglied 5909

Gast
Java:
    @Override
    protected Object clone() throws CloneNotSupportedException{
            return (Person) super.clone();
    }

das hilft dir aber nicht. Du musst schon ein neues Objekt erzeugen und den Inhalt kopieren.
 

drAb17

Mitglied
also mein Beispiel läuft einwandfrei. wollte nur wissen ob es einfacher geht :)

die Idee mit dem super.clone() ist von der Insel.

Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 10.2 Object ist die Mutter aller Klassen


habe die Methode nun zu

Java:
    @Override
    protected Person clone() throws CloneNotSupportedException{
            return (Person) super.clone();
    }
umgeschrieben, damit ich nicht beim aufruf der Methode nochmals casten muss.

Aber ich denke es geht nun nicht mehr mit weniger code. Bei einer Idee Melden :)


Oder gibt es eine Möglichkeit die Methode copyMap, welche die Map kopiert zu generalisieren? evtl. mit Generics? Und so einzuschränken, dass das zweite Argument Cloneable implementieren muss?
Kann mir das jemand zeigen, da ich mit den Generics noch nicht so durchblicke?

DANKE!
 
Zuletzt bearbeitet:

Illuvatar

Top Contributor
Aber ich denke es geht nun nicht mehr mit weniger code. Bei einer Idee Melden :)

Ich würde es nur mit einer foreach-Schleife kompakter schreiben:
Java:
  private static HashMap<String, Person> copyMap(HashMap<String, Person> map) {
    HashMap<String, Person> copyMap = new HashMap<String, Person>();

    for (Map.Entry<String, Person> entry : map.entrySet()) {
      try {
        copyMap.put(entry.getKey(), entry.getValue().clone());
      } catch (CloneNotSupportedException e) {
        e.printStackTrace();
      }
    }

    return copyMap;
  }

Edit:
Oder gibt es eine Möglichkeit die Methode copyMap, welche die Map kopiert zu generalisieren? evtl. mit Generics? Und so einzuschränken, dass das zweite Argument Cloneable implementieren muss?
Kann mir das jemand zeigen, da ich mit den Generics noch nicht so durchblicke?
Leider nicht, da das Cloneable-Zeug etwas fürchterliches ist ;) Wenn es gehen würde, würde es so aussehen:
Java:
  private static <K, V extends Cloneable> HashMap<K, V> copyMap(HashMap<K, V> map) {
    HashMap<K, V> copyMap = new HashMap<K, V>();

    for (Map.Entry<K, V> entry : map.entrySet()) {
      try {
        copyMap.put(entry.getKey(), (V) entry.getValue().clone());
      } catch (CloneNotSupportedException e) {
        e.printStackTrace();
      }
    }

    return copyMap;
  }
Leider muss ein Cloneable-Objekt nicht unbedingt eine öffentliche clone-Methode haben... :oops:
 

drAb17

Mitglied
Danke für deine Antwort. Ich habe nun auch gesehen, an welcher Stelle ich meinen Fehler hatte. Ich habe das vorangestellete <T,U> vergessen :oops:

Ich hatte nun die Idee, da einem Cloneable nicht zu einer implementation zwingt folgendes Interface zu schreiben


Java:
public interface MyCloneable extends Cloneable {
	public Object clone() throws CloneNotSupportedException;
}

Meine Frage ist nun, ist das sauber gelöst. sollte man das tun, oder sollte man für jede Map eine eigene copy Methode schreiben ?


Greez
 

Illuvatar

Top Contributor
Nach dem DRY-Prinzip ist nur eine copy-Methode deutlich besser ;)
Die Frage ist eben, ob in den Maps immer nur Objekte sind von Klassen, die du selbst geschrieben hast - sonst können sie halt leider nicht MyCloneable implementieren.

Das Interface könnte man eventuell noch so machen:
Java:
public interface MyCloneable<T> extends Cloneable {
    public T clone();
}
Dann vereinfacht sich die Kopiermethode:
Java:
  private static <K, V extends MyCloneable<V>> HashMap<K, V> copyMap(HashMap<K, V> map) {
    HashMap<K, V> copyMap = new HashMap<K, V>();
    for (Map.Entry<K, V> entry : map.entrySet()) {
      copyMap.put(entry.getKey(), entry.getValue().clone());
    }
    return copyMap;
  }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Hashtable oder Hashmap mit Inhalt vorbelegen Java Basics - Anfänger-Themen 2
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
A Daten aus einer HashMap aus einer DB speichern und mit neuen Werten vergleichen Java Basics - Anfänger-Themen 8
T HashMap Lsite gibt die sachen nicht aus wie gewollt. Java Basics - Anfänger-Themen 3
krgewb HashMap Java Basics - Anfänger-Themen 2
B Hashmap richtig bauen, die Tripel auf Zahl abbildet? Java Basics - Anfänger-Themen 10
"java.util.HashMap.get(Object)" is null Java Basics - Anfänger-Themen 10
berserkerdq2 Hashmap, wie prüfe ich ob ein Key schon existiert Java Basics - Anfänger-Themen 19
S Durch HashMap iterieren Java Basics - Anfänger-Themen 8
rafi072001 Sortieren einer HashMap nach Values Java Basics - Anfänger-Themen 2
F gson mit einer Hashmap Java Basics - Anfänger-Themen 2
J JSON-HashMap Java Basics - Anfänger-Themen 3
J Hashmap Java Basics - Anfänger-Themen 13
C Hashmap zickt Java Basics - Anfänger-Themen 9
S HashMap contains() Methode Java Basics - Anfänger-Themen 1
Z Satz aufteilen und die Wörter zählen (HashMap) Java Basics - Anfänger-Themen 15
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
P Verschachtelte Hashmap Java Basics - Anfänger-Themen 6
I Sortiert eine HashMap nicht gleich wie eine ArrayList? Java Basics - Anfänger-Themen 1
B HashMap alphabetisch sortieren Java Basics - Anfänger-Themen 2
J HashMap Java Basics - Anfänger-Themen 6
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
U Hashmap Iterator selbst implementieren Java Basics - Anfänger-Themen 10
N HashMap in List good practice? Java Basics - Anfänger-Themen 2
K Value eines HashMaps in einer HashMap wiedergeben. Java Basics - Anfänger-Themen 5
O Hashmap, ArrayList, LinkedList Java Basics - Anfänger-Themen 7
O HashMap - ArrayList Java Basics - Anfänger-Themen 29
J Hashmap langsamer als compareTo? Java Basics - Anfänger-Themen 23
E HashMap+Vererbung Java Basics - Anfänger-Themen 11
J Erhöhen eines Values als Integer bei gleichen Keys in HashMap Java Basics - Anfänger-Themen 12
N Methoden HashMap interne Werte miteinander vergleichen Java Basics - Anfänger-Themen 7
W The type Long is not visible HashMap Java Basics - Anfänger-Themen 4
M Objekt mit Hashmap vergleichen Java Basics - Anfänger-Themen 22
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C HashMap - alle keys haben values der letzten put-Anweisung Java Basics - Anfänger-Themen 3
J Hashmap auslesen Java Basics - Anfänger-Themen 7
F HashMap sortieren <String, Long> Java Basics - Anfänger-Themen 3
GreenTeaYT HashMap dupliziert meine Elemente? Java Basics - Anfänger-Themen 2
shiroX Methoden Morse-Code Übersetzer mit HashMap Java Basics - Anfänger-Themen 5
E HashMap Problem Java Basics - Anfänger-Themen 5
P Hashmap anstatt LinkedList? Java Basics - Anfänger-Themen 6
T HashMap und die Methoden Java Basics - Anfänger-Themen 13
N Methoden Interaktives PDF mit HashMap befüllen Java Basics - Anfänger-Themen 0
Z Hashmap auseinandernehmen und analysieren Java Basics - Anfänger-Themen 7
B Durchlaufen von Hashmap und Arraylist Java Basics - Anfänger-Themen 8
F HashMap oder welches Array? Java Basics - Anfänger-Themen 4
T HashMap Java Basics - Anfänger-Themen 24
L Hashmap mit variablem Key Java Basics - Anfänger-Themen 9
M Collections Probleme mit Hashmap Java Basics - Anfänger-Themen 4
N Collections String in HashMap umwandeln Java Basics - Anfänger-Themen 3
Z HashMap richtig benutzen Java Basics - Anfänger-Themen 2
lgund HashMap // TS3 Query Java Basics - Anfänger-Themen 7
Z Hashmap Iterator löscht nicht Java Basics - Anfänger-Themen 8
E Hashmap Wert auslesen Java Basics - Anfänger-Themen 2
S Printstream für einen Hashmap Loop Java Basics - Anfänger-Themen 1
dat_vin OOP Hashmap und Attribute Java Basics - Anfänger-Themen 7
C Check ob eine HashMap schon existiert Java Basics - Anfänger-Themen 16
P Vererbung Eigene HashMap Variante Java Basics - Anfänger-Themen 2
R Hashmap in anderer Klasse nicht benutzbar Java Basics - Anfänger-Themen 1
T Java Hashmap Java Basics - Anfänger-Themen 3
L Gibt es etwas wie "HashMap <String, String, String> Java Basics - Anfänger-Themen 9
K HashMap mit Daten aus ArrayList befüllen Java Basics - Anfänger-Themen 14
S OOP Klasse mit static-Eigenschaften - HashMap füllen Java Basics - Anfänger-Themen 6
O HashMap Fragen Java Basics - Anfänger-Themen 8
T HashMap Werte einfügen, durchsuchen und auslesen Java Basics - Anfänger-Themen 17
M Semantisches Problem HashMap/Netzwerk Java Basics - Anfänger-Themen 4
D HashMap Keys durchlaufen Java Basics - Anfänger-Themen 2
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
M HashMap keys ausgeben Java Basics - Anfänger-Themen 2
S In einer Hashmap Klassen regestrieren Java Basics - Anfänger-Themen 2
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
F HashMap nach kleinstem Value durchsuchen Java Basics - Anfänger-Themen 11
G HashMap Java Basics - Anfänger-Themen 6
F Wortpaare - HashMap - ArrayList Java Basics - Anfänger-Themen 6
M HashMap Frage Java Basics - Anfänger-Themen 3
M HashMap - put() reagiert nicht? Java Basics - Anfänger-Themen 8
N Cast eines Objektes in eine Hashmap Java Basics - Anfänger-Themen 13
A CSV Zeilenweise einlesen und in einer HashMap speichern Java Basics - Anfänger-Themen 12
A Input/Output Hashmap in einem JPanel via JList anzeigen Java Basics - Anfänger-Themen 8
K HashMap auf leere Key-Value-Paare prüfen Java Basics - Anfänger-Themen 14
F Hilfe bei der HashMap. Java Basics - Anfänger-Themen 3
F HashMap vs. TreeMap Java Basics - Anfänger-Themen 5
B HashMap Java Basics - Anfänger-Themen 9
C Collections String[] als value in HashMap Java Basics - Anfänger-Themen 6
V Hashmap Iterieren Java Basics - Anfänger-Themen 4
C Csv File in Hashmap ausgeben Java Basics - Anfänger-Themen 14
T HashMap<String,Object> Werte auslesen Java Basics - Anfänger-Themen 5
I HashMap sortieren Java Basics - Anfänger-Themen 10
I HashMap Java Basics - Anfänger-Themen 11
H Collections Brauche modifizierte HashMap Java Basics - Anfänger-Themen 6
H TreeMap/HashMap synchronisieren Java Basics - Anfänger-Themen 2
A Datentypen Hashmap to Array Java Basics - Anfänger-Themen 11
D HashMap überschreibt Werte Java Basics - Anfänger-Themen 7
pg1337 Interface Comparable-Interface bei HashMap Java Basics - Anfänger-Themen 21
D erweiterte hashmap Java Basics - Anfänger-Themen 5
H HashMap<Int, String> - Er findet die Int-Klasse nicht. Java Basics - Anfänger-Themen 3
L HashMap zu JList Java Basics - Anfänger-Themen 6
S Erste Schritte HashMap Kurze Frage - Werte über Schleife ausgeben Java Basics - Anfänger-Themen 30
F Collections ArrayList oder Hashmap mittel Collections.sychronised Java Basics - Anfänger-Themen 6
B Klassen HashMap Zwei Objekte, gleicher Key Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben