HashMap

GroovyChuc

Mitglied
Die Aufgabe ist es eine simple Hashmap zu implementieren.
So sieht mein Entwurf dafür aus:

Java:
package src;

import java.util.*;

public class SimpleHashMap<T, V> implements IHashMap<T, V> {
	LinkedList<HashObject<T, V>>[] array;
	Collection<V> collection;

	public SimpleHashMap(int moduloX) {
		array = new LinkedList[moduloX];

		for (int i = 0; i < moduloX; i++) {

			array[i] = new LinkedList<HashObject<T, V>>();
		}

	}

	@Override
	public void clear() {
		/**
		 * Removes all mappings from this map.
		 */
		int m = array.length;
		for (int i = 0; i < m; i++) {

			array[i] = new LinkedList<HashObject<T, V>>();
		}

	}

	@Override
	public boolean containsKey(T key) {
		/**
	     * Returns true if this map contains a mapping for the specified key.
	     * @param key
	     * @return true if key is contained. else false
	     */
		int h = key.hashCode();
		h = h % array.length;

		for (int i = 0; i <= array[h].size(); i++) {
			if (array[h].get(i).equals(null)) {
				break;
			}
			if (array[h].get(i).getKey().equals(key)) {
				return true;
			}
		}
		return false;
	}

	@Override
	public boolean containsValue(V value) {
		/**
	     * Returns true if this map maps one or more keys to the specified value.
	     * @param value
	     * @return
	     */
		for (int i = 0; i <= array.length; i++) {
			if (array[i].contains(value)) {
				return true;
			}
		}
		return false;
	}

	@Override
	public V get(T key) {
		/**
	     * Returns the value to which the specified key is mapped 
	     * in this identity hash map, or null if the map contains no mapping for this key.
	     */
		int h = key.hashCode();
		h = h % array.length;
		for (int i = 0; i <= array[h].size(); i++) {
			if (array[h].get(i).equals(null)) {
				break;
			}
			if (array[h].get(i).getKey().equals(key)) {
				V value = array[h].get(i).getValue();
				return value;
			}
		}
		return null;
	}

	@Override
	public boolean isEmpty() {
		/**
		 * Returns true if this map contains no key-value mappings.
		 * @return
		 */
		boolean b = true;
		int l = array.length;
		for (int i = 0; i <= l; i++) {
			if (array[i] != null) {
				b = false;
			}
		}
		return b;
	}

	@Override
	public void put(T key, V value) {
		/**
		 * Associates the specified value with the specified key in this map.
		 */
		int h = key.hashCode();
		h = h % array.length;
		if(containsKey(key)){
			remove(key);
		}
		array[h].add(new HashObject<T, V>(key, value));
	}

	@Override
	public void remove(T key) {
		/**
		 * Removes the mapping for this key from this map if present.
		 * 
		 * @param key
		 */
		int h = key.hashCode();
		h = h % array.length;
		for (int i = 0; i <= array[h].size(); i++) {

			if (array[h].get(i).equals(null)) {
				break;
			}
			if (array[h].get(i).getKey().equals(key)) {
				array[h].remove(i);
			}
		}
	}

	@Override
	public Collection<V> values() {
		/**
		 * Returns a Collection containing all values in the HashMap
		 * @return
		 */
		for (int i = 0; i <= array.length; i++) {
			for (int c = 0; c <= array[i].size(); c++) {
				if (array[i].get(c).getValue().equals(null)) {
					break;
				}

				else {
					collection.add(array[i].get(c).getValue());
				}
			}
		}
		return collection;
	}

	@Override
	public int size() {
		/**
		 * Returns the number of key-value mappings in this map.
		 * 
		 * @return
		 */
		int counter = 0;
		for (int i = 0; i <= array.length; i++) {

			if (array[i] != null) {
				counter += array[i].size();
			}
		}
		return counter;
	}

}

Java:
package src;


public class HashObject<T, V> {
private T key; 
private V value;

	public HashObject(T key, V value) {
		this.key = key;
		this.value = value;
	}
	
	public T getKey(){
		return key;
	}
	
	public V getValue(){
		return value;
	}
}

Allerdings spuckt die zugehörige JUnit Datei einige Fehler aus.

Java:
package src;

import java.util.Collection;

import junit.framework.Assert;

import org.junit.Test;


public class TestHashMap {

	public static final int moduloX=1000;
	
	
	@Test
	public void testHash(){
		SimpleHashMap<String, Integer> map = new SimpleHashMap<String, Integer>(moduloX);
		
		String one = "1";
		String two = "2";
		String three = "3";
		String four = "4";
		
		map.put(one, 155);
		
		Assert.assertEquals(new Integer(155), map.get(one));
		map.put(one, 1555);
		map.put(two, 13);
		map.put(three, 663);
		map.put(four, 15551);
		
		Assert.assertEquals(new Integer(1555), map.get(one));
		Assert.assertEquals(new Integer(13), map.get(two));
		Assert.assertEquals(new Integer(663), map.get(three));
		Assert.assertEquals(new Integer(15551), map.get(four));
		Assert.assertEquals(true, map.containsValue(15551));
		

		Collection<Integer> values = map.values();
		Assert.assertTrue(values.contains(1555));
		Assert.assertTrue(values.contains(13));
		Assert.assertTrue(values.contains(663));
		Assert.assertTrue(values.contains(15551));
		Assert.assertEquals(4, values.size());
		
		
		map.remove(four);
		Assert.assertEquals(false, map.containsValue(15551));
		Assert.assertEquals(null, map.get(four));
		Assert.assertEquals(false, map.containsKey(four));

		
		map.clear();
		
		// Geschwindigkeitsmessung
		long begin = System.currentTimeMillis();
		for(int i = 0;i<100000;i++){
			if(i%5000==0){
				System.out.println(i+"");
			}
			map.put(new Integer(i).toString(),i);
			Assert.assertEquals(new Integer(i), 
					map.get(new Integer(i).toString()));
		}
		long ende = System.currentTimeMillis();
		System.out.println("Es wurden "+(ende-begin)/1000+" Sekunden benötigt");
		
		
	}
}

Die put(T key, V value) Methode scheint zu funktionieren, wenn ich nicht die Abfrage mache ob es das Objekt gibt(Also ohne die remove(T key) und ohne containsKey(T key)).
Die containsValue(V value) und die size() Methode hingegen funktionieren nicht wie vorgesehen.

Den Rest hab ich noch nicht getestet aber ich befürchte ähnliches.

Freue mich auf Hilfe

Mfg
 
S

SlaterB

Gast
was ist denn jetzt deine Vorgehensweise zur Fehlersuche,
du programmierst den Code, du programmierst den Test, wenn er nicht schon vorgegeben ist, Fehler tritt auf, und nun?

jemand anders fragen ist eine Variante,
schon weitaus erfreulicher als manche, die gar nicht die Map selber programmieren würden sondern das schon fragen ;)

aber es muss doch dein Ziel sein, auch Fehler selbst strukturiert zielführend zu finden?
die goldene Regel dazu ist so banal wie effektiv:
schaue dir an, was passiert!
mit Debugger oder System.out.println(), verfolge nach was bei einem put passiert, welcher hashCode() zur Verwendung kommt, welcher Array-Platz belegt wird usw.

bzw. put() ist vielleicht nicht das Problem, dann schaue dir containsValue() an, wie ist dort der Zustand des Arrays,
welcher Index enthält eine Liste oder null, was ist in den Listen drin, das richtige Objekt?
warum funktioniert [c]array.contains(value)[/c] für den bestimmten richtigen Index i nicht, was macht eigentlich contains()?

wenn du es nicht erklären kannst, dann verzichte lieber auf unbekannte Methoden und verwende erstmal eine normale Schleife,
also neben Code + Ausführung anschauen auch noch Code ändern:
wie musst du die Liste an ArrayPlatz-i durchlaufen, wie jedes Objekt mit dem value-Parameter vergleichen?
usw.

tausende Dinge muss man abarbeiten, einen Überblick, die Kontrolle über das Programm gewinnen

-------

wenn du auf diese wesentliche Programmierfähigkeit verzichten willst, dann sei als Lösung zumindest eines offensichtlichen Problems gesagt:
wie gesagt contains() ein Problem, die Liste enthält keine Values, sondern HashObject,
kein HashObject in den Listen wird mit dem übergebenen Value gleich sein
 
Zuletzt bearbeitet von einem Moderator:

GroovyChuc

Mitglied
Ok ich hab mal grad versuch mein Programm zu debuggen.
Und jedes mal wenn ich in der containsKey(T key) Methode auf
Java:
if (array[h].get(i).equals(key)) {
				break;
			}

zugreife, gibts eine Index out of bound exeption.
Und ich hab keine Idee wieso.

Java:
if (array[h].get(i)==null) {
Hier das gleiche

Edit: Kann es sein, dass i = 1 sein muss, da es die Stelle array[h].get(0) gar nicht gibt?
 
Zuletzt bearbeitet:

GroovyChuc

Mitglied
So jetzt geht eigentlich fast alles, aber hier wirft mir mir der Compiler eine InvocationTargetException und eine NullPointerException für arg0 wenn ich die Methode collection.add(v) aufrufe.

Aber wieso? Das Objekt ist definitiv da. Per System.out wird 1555 auf der Konsole ausgegeben. Dennoch lässt es sich trotz richtigem Typ nicht hinzufügen.

Java:
public Collection<V> values() {
		/**
		 * Returns a Collection containing all values in the HashMap
		 * 
		 * @return
		 */
		for (int i = 0; i <= array.length; i++) {
			for (int c = 0; c < array[i].size(); c++) {
				V v = array[i].get(c).getValue();
				System.out.println(v);			
					collection.add(v);
				
			}
		}
		return collection;
	}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
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
N HashMap fehlerhafte Rückgabe Java Basics - Anfänger-Themen 7
K Durch eine HashMap wandern? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben