Hashtable ?

Status
Nicht offen für weitere Antworten.
M

Manuela001

Gast
Hallo ich habe eine Frage

Ich lade meine daten nach dem Start des Programms in ein Hashtable soweit so gut.

jetzt können verschieden angaben gemacht werden die den Inhalt des Hashtable verändern.

ich will aber, das wenn ich mein Programm beende,eine Überprüfung gemacht wird, ob es eine Änderung in der Hashtable gegeben hat.

so etwas wie if(Hashtable(start) == Hashtable(Ende)){
speicher mir den Inhalt
wenn es keine Änderung gab brauh man auch nicht speichern.

Wie kann ich das machen.

Gruß Manuela
 

khaputt

Mitglied
Eine Möglichkeit wäre dir den hashCode der Map beim Initialisieren zu Speicher. Vor dem Abspeichern neu zu berechnen und mit dem alten hashCode zu vergleichen...

Code:
public class Hash {

  Map<String, String> map = new HashMap<String, String>();

  public void fillMap(String a, String b) {
    map.put(a, b);
  }

  public int calcHash() {
    return map.hashCode();
  }

  public static void main(String[] args) {
    Hash hash = new Hash();

    hash.fillMap("Eins", "One");
    hash.fillMap("Zwei", "Two");

    System.out.println(hash.calcHash());

    hash.fillMap("Drei", "Three");

    System.out.println(hash.calcHash());
  }
}
 

Marco13

Top Contributor
Vielleicht sollte man noch erwähnen, dass der berechnete Wert vor und nach der Änderung nicht unbdeingt unterschiedlich sein muss. Es KANN also sein, dass man eine Änderung nicht mitbekommt. Die einzig "sichere" Lösung, die mir spontan einfallen würde, wäre, eine Wrapper-Klasse für die Map zuschreiben, die alle Änderungen registriert...
 

HoaX

Top Contributor
ein aller einfachsten ist es wenn du dir am anfang, nach dem initialiesieren deiner hashtable mit werten, einen iterator geben lässt und dir diesen merkst. wenn du beim beenden iterator#hasNext bzw iterator#next aufrufst und eine ConcurrentModificationException fliegt, dann wurde was geändert
 

abollm

Top Contributor
Manuela001 hat gesagt.:
[..]
ich will aber, das wenn ich mein Programm beende,eine Überprüfung gemacht wird, ob es eine Änderung in der Hashtable gegeben hat.

so etwas wie if(Hashtable(start) == Hashtable(Ende)){
speicher mir den Inhalt
wenn es keine Änderung gab brauh man auch nicht speichern.

Wie kann ich das machen.
[..]

So auf die Schnelle würde ich es so machen:
Code:
package hashmap;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class CompareHashMaps {
	@SuppressWarnings("unchecked")
	public static void main(String[] argv) {

		HashMap hm1 = new HashMap();
		HashMap hm2 = new HashMap();

		// hash maps 
		hm1.put("Adobe", "Mountain View, CA");
		hm1.put("IBM", "White Plains, NY");
		hm1.put("Learning Tree", "Los Angeles, CA");
		hm1.put("Microsoft", "Redmond, WA");
		hm1.put("Netscape", "Mountain View, CA");
		hm1.put("O'Reilly", "Sebastopol, CA");
		hm1.put("Sun", "Mountain View, CA");

		hm2.put("Adobe", "Mountain View, CA");
		hm2.put("IBM", "White Plains, NY");
		hm2.put("Learning Tree", "Los Angeles, CA");
		hm2.put("Microsoft", "Redmond, WA");
		hm2.put("Netscape", "Mountain View, CA");
		hm2.put("O'Reilly", "Sebastopol, CA");
		hm2.put("Sun", "Mountain View, CA");

        // Vergleich 1
        if (equals(hm1, hm2)) {
        	System.out.println("Sie sind gleich");
		} else
			System.out.println("Sie sind *nicht* gleich");
        // Hinzufügen eines Werts in HashMap 2
        hm2.put("Hanser", "München, D-By");
//      Vergleich 2
        if (equals(hm1, hm2)) {
        	System.out.println("Sie sind gleich");
		} else
			System.out.println("Sie sind *nicht* gleich");
	}
	//
	public static boolean equals(Map m1, Map m2) {
		   Set key1 = m1.keySet();
		   Set key2 = m2.keySet();
		   if (!key1.equals(key2))
		       return false;
		 
		   for (Iterator it=key1.iterator(); it.hasNext(); ) {
		       Object key = it.next();
		       if (!m1.get(key).equals(m2.get(key)))
		           return false;
		   }
		   return true;
		}
}

Vielleicht hilft es dir ja.
 

L-ectron-X

Gesperrter Benutzer
Hashtables/HashMaps können je nach Objekttyp recht groß werden. Wenn man zwei Hashtables davon hat, kann man u.U. an die Grenzen des Speichers kommen. Daher würde ich das auch so wie Marco13 machen.
 
G

Gast

Gast
Manuela,

wie gross ist die Datei, die Du am Anfang einliest (ca.) ?

Können Änderungen zu einer massiven Vergrößerung der Datenmenge führen ?
 

Murray

Top Contributor
HoaX hat gesagt.:
also ich behaupte meine lösung ist die resourcenschonenste und schnellste möglichkeit ;)
Wenn es nur darum geht festzustellen, ob Objekte hinzugefügt, gelöscht oder ausgetauscht wurden, dann bestimmt. Wenn es aber sein kann, dass ein in der Hashtable gespeichertes Objekt verändert wurde, dann reicht das nicht. In dem Fall reicht aber auch die Lösung mit dem Wrapper, der bei den relevanten Methoden ein "Modified-Flag" setzt, nicht aus - dann muss man wohl wirklich elementweise vergleichen
 

Wildcard

Top Contributor
HoaX hat gesagt.:
also ich behaupte meine lösung ist die resourcenschonenste und schnellste möglichkeit ;)
Ach, einen Stacktrace zu generieren ist schonender als ein Flag umzuschießen? :autsch:
Anonyme innere Klasse machen -> put überschreibe -> flag auf true setzen -> fertig
 
G

Gast

Gast
Nun sollte man mal definieren, was denn eine relevante Änderung ist!

Code:
...
map.put("a", "a");
...
map.put("a", "b");
...
map.put("a", "a");

Muss die Map gespeichert werden !?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben