HashSet Implementierung

j-frost

Mitglied
Hallo Leute,

ich habe folgende Methode geschrieben:

Java:
	public boolean hasValue(int value) {
		int hash = hash(value);
		Integer element = list.get(hash);
		//return (element != null);
		if (element == null)
			return false;
		else 
			return true;
		
	}

Warum liefert die immer true?

LG,

j-frost
 

Haave

Top Contributor
Hab noch nicht so recht nen Plan, aber: was ist denn hash() für eine Methode? Was macht die mit value?

[JAVA=2]int hash = hash(value);[/code]
 

j-frost

Mitglied
Hab noch nicht so recht nen Plan, aber: was ist denn hash() für eine Methode? Was macht die mit value?

[JAVA=2]int hash = hash(value);[/code]

Naja, vom Prinzip her soll hash(int) irgendwann die Hashfunktion sein. Allerdings ist sie bis jetzt nur

Java:
	private int hash(int x) {
		int m = n - 1; // Something's wrong. Can you see what? x_X 
		return x % m;
	}
und ich bin mir ziemlich sicher, dass das so nicht stimmt...
 

Haave

Top Contributor
Java:
	private int hash(int x) {
		int m = n - 1; // Something's wrong. Can you see what? x_X 
		return x % m;
	}
Das wird sich schon nicht kompilieren lassen, weil du n nirgendwo deklarierst ;)

Naja, vom Prinzip her soll hash(int) irgendwann die Hashfunktion sein.
Ich weiß ja nicht genau, was du vorhast, aber wäre es nicht u.U. sinnvoller, gleich die eingebaute hashCode()-Methode zu überschreiben?
 

j-frost

Mitglied
ich würde mal den ganzen code posten... sonst dauert das noch die ganze nacht...

Sorry, glaub auch, dass das das Beste ist. Hier isser:

Java:
package blatt7_aufgabe1;

import java.util.LinkedList;

public class MyHashSet implements HashInterface {

	int n;
	LinkedList<Integer> list = new LinkedList<Integer>();
		
	public MyHashSet(int size) {
		n = size;
		for(int i = 0; i < n; i++) {
			list.add(null);     // Generating n buckets... is that right? 
		}
	}

	private int hash(int x) {
		int m = n - 1; // Something's wrong. Can you see what? x_X 
		return x % m;
	}

	public void insert(int value) {	
		if (!(hasValue(value))) {
			list.remove(hash(value));
			list.add(hash(value), value);
		}
	}

	public void delete(int value) {	
		if (hasValue(value)) {
			list.remove(hash(value));
		}
	}

	public boolean hasValue(int value) {
		int hash = hash(value);
		Integer element = list.get(hash);
		//return (element != null);
		if (element == null)
			return false;
		else 
			return true;
		
	}

	public double[] statistics() {
		// needs implementation desperately... 
		return null;
	}

}
 

j-frost

Mitglied
Funzt bei mir eig. ohne Probleme.
Zeig mal deinen Testcode.

Testcode:

Java:
package blatt7_aufgabe1;

public class TestHashSet {

	public static void main(String[] args) {
		int n = 10000;
		
		MyHashSet myHashSet = new MyHashSet(n);
		
		for(int i = 0; i < n; i++) {
			myHashSet.insert(i);
		}
		/*
		System.out.print("minimale Kollisionsliste:"+hashSet.statistics()[0]);
		System.out.print("maximale Kollisionsliste:"+hashSet.statistics()[1]);
		System.out.print("Mittelwert Kollisionslänge:"+hashSet.statistics()[2]);
		System.out.print("Standardabweichung Kollisionslänge:"+hashSet.statistics()[3]);
		*/
		System.out.println(myHashSet.hasValue(1234));
		System.out.println(myHashSet.hasValue(0));
		System.out.println(myHashSet.hasValue(9999));
		System.out.println(myHashSet.hasValue(10000));
		System.out.println(myHashSet.hasValue(10001));
		System.out.println(myHashSet.hasValue(20001));
	
	}

}
 

ARadauer

Top Contributor
// Generating n buckets... is that right?
ja

// Something's wrong. Can you see what? x_X
mhn ok...
ich würd das -1 weg lasssen...
schreiben.. mach dir eine print methode die dir die liste ausgibt..

Java:
 public void print(){
    	for(int i = 0; i < list.size(); i++)
    		System.out.println(i+" "+list.get(i));
    }
dann siehst du was passiert..

Java:
public static void main(String[] args) {
		MyHashSet set = new MyHashSet(5);
		System.out.println(set.hasValue(3));
		set.insert(2);
		set.insert(3);
		set.insert(4);
                         set.insert(5);
		
		set.print();
	}


0 5
1 null
2 2
3 3
4 4

es kommt halt drauf an was man bei 5 elementen vor hast


also grundsätzlich funktioniert das mit hashvalue schon..
hier musst du aufpassen..
list.remove(hash(value));
achtung... du vernichtest dein bucket. also wenn du remove machst und du hast 2, 3, 4 drinnen, machst ein remove auf 3 dann ist 4 anstelle von 3... du willst eher 3 auf null setzen..
 
G

Gast2

Gast
Also du füllst dein komplettes Hashset, hast ne Hashfunktion die dir lediglich mit modulo die hashs berechnet. Und dann kommts dir komisch vor dass alle prüfungen auf hasValue true ergeben? ;)

EDIT:
Du solltest anstatt der Liste ne Map<Integer, Integer> nehmen und die Hashfunktion gegen eine geignetere (z.b. von Eclipse generierte) austauschen, dann solltest du weniger Kollisionen haben und deine Tests sollten hinhaun :)
 
Zuletzt bearbeitet von einem Moderator:

j-frost

Mitglied
hier musst du aufpassen..
list.remove(hash(value));
achtung... du vernichtest dein bucket. also wenn du remove machst und du hast 2, 3, 4 drinnen, machst ein remove auf 3 dann ist 4 anstelle von 3... du willst eher 3 auf null setzen..

Ja richtig, ich muss an der Stelle hash(value) das element = null; setzen. Danke :)

Also du füllst dein komplettes Hashset, hast ne Hashfunktion die dir lediglich mit modulo die hashs berechnet. Und dann kommts dir komisch vor dass alle prüfungen auf hasValue true ergeben? ;)

EDIT:
Du solltest anstatt der Liste ne Map<Integer, Integer> nehmen und die Hashfunktion gegen eine geignetere (z.b. von Eclipse generierte) austauschen, dann solltest du weniger Kollisionen haben und deine Tests sollten hinhaun :)

Ich hab mir jetzt mal gedacht, dass ich ein array mache, wo LinkedList<Integer>'s drin sind und Integer. Bloß weiß ich nicht, wie ich das abfragen soll. Und warum soll ich 'ne Map nehmen? Das kenn' ich gar nicht. Wie funktioniert das?

Also was ich bis jetzt geschaffen habe ist:

Java:
package blatt7_aufgabe1;

import java.util.LinkedList;

public class MyHashSet implements HashInterface {

	int n;
	Object[] array;
	
	public MyHashSet(int size) {
		n = size;
		for(int i = 0; i < n; i++) {
			array[i] = null;
		}
	}

	private int hash(int x) {
		int m = n; // Something's wrong. Can you see what? x_X 
		return x % m;
	}

	public void insert(int value) {	
		if (!(hasValue(value))) {
			array[hash(value)] = value;
		}
		else if (hasValue(value)) {
			LinkedList<Integer> foo = new LinkedList();
			foo.add(value);
                        // TODO write foo into the array 
		}
	}

	public void delete(int value) {	
		/*if (hasValue(value)) {
			list.remove(hash(value));
		}*/
	}

	public boolean hasValue(int value) {
		Object element = array[hash(value)];
		if (element == null) 
			return false;
		/* if (element an Integer)
		 * 		if (element == value)
		 * 			return true;
		 * else if (element a LinkedList<Integer>)
		 * 		if (element.contains(value)
		 * 			return true;
		 * else 
		 * 		return false;
		*/
	}

	public double[] statistics() {
		// needs implementation desperately... 
		return null;
	}

}

Bloß den groß auskommentierten Teil kann ich nicht implementieren. Keine Ahnung wie.
 
Zuletzt bearbeitet:
G

Gast2

Gast
Ich hab mir jetzt mal gedacht, dass ich ein array mache, wo LinkedList<Integer>'s drin sind und Integer. Bloß weiß ich nicht, wie ich das abfragen soll. Und warum soll ich 'ne Map nehmen? Das kenn' ich gar nicht. Wie funktioniert das?
Erstmal zum warum:
Du hast in deinem Array n mögliche Keys. Wenn du deine Hashfunktion auf die keys (0...n-1) abbildest dann bekommst du sehr viele Kollisionen , und das ist in ner hashmap immer mist.
Nimmst du ne Map<Integer, Integer> dann hast du als möglichen Wertebereich den Wertebereich Integer.MIN_VALUE bis Integer.MAX_VALUE. Mit ner geschickten Hashfunktion kannst du damit dann deine anzahl an Kollisionen verringern und bekommst somit auch genauere Werte bei hasValue.
Zur Anwendung:
einfach mal googlen ;)
 

j-frost

Mitglied
Erstmal zum warum:
Du hast in deinem Array n mögliche Keys. Wenn du deine Hashfunktion auf die keys (0...n-1) abbildest dann bekommst du sehr viele Kollisionen , und das ist in ner hashmap immer mist.
Nimmst du ne Map<Integer, Integer> dann hast du als möglichen Wertebereich den Wertebereich Integer.MIN_VALUE bis Integer.MAX_VALUE. Mit ner geschickten Hashfunktion kannst du damit dann deine anzahl an Kollisionen verringern und bekommst somit auch genauere Werte bei hasValue.
Zur Anwendung:
einfach mal googlen ;)

OK, gut, aber da ich nur Zahlen abspeichern will kann ich doch auch 'n Array von LinkedLists machen? Denn auf dem Aufgabenblatt steht (diesmal zum ersten Mal) "Sie dürfen java.util.LinkedList verwenden". Ich gehe also davon aus, dass eine Lösung LinkedLists verwenden soll und sonst eher nichts, da keine Aussage darüber gemacht wurde, ob andere java.*s benutzt werden dürfen. Und in dieser Veranstaltung zählen die Blätter schon auf die finale Note drauf. D.h. ich will da kein Risiko eingehen.

Ich bastel noch ein bisschen und poste dann mal wieder 'ne geupdatete Version. Hoffentlich ist die dann auch fertig :p Ansonsten hoffe ich, hier weiter Hilfe zu erhalten, ihr seid super(,) Leute! (nur so nebenbei)

LG,

j-frost
 

Landei

Top Contributor
Nebenbei gesagt kräuseln sich mir bei

Java:
        if (element == null)
            return false;
        else 
            return true;

die Fußnägel. Das schreibt man so:

Java:
      return element != null;
 

j-frost

Mitglied
OK, danke für alle Tips bis hierher. Ich hab's jetzt mal so gemacht, hoffe, das findet eure Zustimmung. [edit: jetzt müsste auch die statistics() so stimmen] Findet noch wer 'nen Fehler? Ansonsten halt close, ne? ^^

Java:
package blatt7_aufgabe1;
 
import java.util.LinkedList;
 
public class MyHashSet implements HashInterface {
 
    int n;
    LinkedList[] array;
    
    public MyHashSet(int size) {
        n = size;
        array = new LinkedList[n];
        for(int i = 0; i < n; i++) {
            array[i] = null;
        }
    }
 
    private int hash(int x) {
        int m = n; // Something's wrong. Can you see what? x_X 
        return x % m;
    }
 
    public void insert(int value) { 
        if (!(hasValue(value))) {
			if ((array[hash(value)]) != null)
				array[hash(value)].add(value);
			else {
				array[hash(value)] = new LinkedList<Integer>();
				array[hash(value)].add(value);
			}
        }
    }
 
    public void delete(int value) { 
    	Integer valueObj = value;
        if (hasValue(value)) {
            array[(hash(value))].remove(valueObj);
        }
    }
 
    public boolean hasValue(int value) {
        LinkedList<Integer> list = array[hash(value)];
        if (list != null)
        	return list.contains(value);
        return false;
    }
 
    public double[] statistics() {
    	double min_size = Integer.MAX_VALUE, max_size = 0, mean_size = 0, deviation = 0;
    	for(int i = 0; i < n; i++) {
			if (array[i] != null) {
				int size = array[i].size();
				if (size < min_size)
					min_size = size;
				if (size > max_size)
					max_size = size;
				mean_size += size;
			}
		}
		mean_size /= n;
		for (int i = 0; i < n; i++) {
			if (array[i] != null) {
				int size = array[i].size();
				deviation += Math.pow(size - mean_size, 2);
			}
		}
    	deviation /= n;
    	deviation = Math.sqrt(deviation);
        double[] result = new double[4];
        result[0] = min_size;
        result[1] = max_size;
        result[2] = mean_size;
        result[3] = deviation;
        return result;
    }
 
}

edit:

Nebenbei gesagt kräuseln sich mir bei

Java:
        if (element == null)
            return false;
        else 
            return true;

die Fußnägel. Das schreibt man so:

Java:
      return element != null;

Ja, ich weiß, das ist ziemlich hässlich, aber darüber steht ja auskommentiert dasselbe, was du wolltest. Ich war mir nur kurz mal nicht sicher, weil irgendwie gar nichts ging, und hab' dann erstmal foolproof getestet.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Collections Problem bei Überschreibung von hashcode() und equals() bei Hashset-Implementierung Java Basics - Anfänger-Themen 5
J HashSet mit Comparable sortieren Java Basics - Anfänger-Themen 13
berserkerdq2 Geht collections.sort bei allen? Linkedhashset, ArrayList, HashSet etc. Java Basics - Anfänger-Themen 4
volcanos HashSet und Iterator -> Falsche Sortierreihenfolge ? Java Basics - Anfänger-Themen 18
D Erste Schritte Code verstehen - HashSet Java Basics - Anfänger-Themen 8
J Hashset Java Basics - Anfänger-Themen 13
J HashSet Methode contains liefert false (hash Methode überschrieben) Java Basics - Anfänger-Themen 3
W Element aus HashSet in String umformen Java Basics - Anfänger-Themen 7
T HashSet in List-Object Java Basics - Anfänger-Themen 5
C Auf einzelne Werte aus HashSet zugreifen Java Basics - Anfänger-Themen 10
J Klassen HashSet, TreeSet: unregelmäßige Zahlenreihen beim Befüllen Java Basics - Anfänger-Themen 7
T Methoden HashSet Objekt mit Zufallszahlen befüllen Java Basics - Anfänger-Themen 3
J Verstehe meine HashSet Ausgabe nicht Java Basics - Anfänger-Themen 5
W Verknüpfung von Räumen mit Hashset Java Basics - Anfänger-Themen 10
J HashSet contain Methode funktioniert nicht wie gewollt Java Basics - Anfänger-Themen 7
M Collections HashSet verständnisproblem Java Basics - Anfänger-Themen 9
R Hashset.add(Array) liefert immer true? Java Basics - Anfänger-Themen 23
Mrtwomoon Collections Hashset elemente ohne Eckigeklammer ausgeben Java Basics - Anfänger-Themen 9
A Elemente in HashSet enthalten oder nicht Java Basics - Anfänger-Themen 6
A HashSet (oder besser geignetes) Java Basics - Anfänger-Themen 14
T Hashset - Allgemeine Fragen Java Basics - Anfänger-Themen 19
J So ähnlich wie HashSet Java Basics - Anfänger-Themen 2
D HashSet vs Liste Java Basics - Anfänger-Themen 5
T HashSet Java Basics - Anfänger-Themen 3
F suche Elemente in HashSet Java Basics - Anfänger-Themen 5
E Collections HashSet - Ausgabe sortiert? Java Basics - Anfänger-Themen 3
J HashSet Fehlerhaft Java Basics - Anfänger-Themen 10
D Problem mit HashSet Java Basics - Anfänger-Themen 12
darekkay Datentypen HashSet bzw. LinkedList mit Werten initialisieren Java Basics - Anfänger-Themen 3
B Hashset iterieren problem Java Basics - Anfänger-Themen 3
C HashSet Problem Java Basics - Anfänger-Themen 3
DasBrot Datentypen HashSet contains() Java Basics - Anfänger-Themen 3
F HashSet u. LinkedHashSet Zugriff auf Werte? Java Basics - Anfänger-Themen 2
F HashSet und LinkedHashSet Instanzierung warum so? Java Basics - Anfänger-Themen 7
M HashSet.contains() Java Basics - Anfänger-Themen 2
N Map<String, HashSet<String>> Umwandeln in Map<String, ArrayList<String>> Java Basics - Anfänger-Themen 14
neurox Limit bei HashSet? Java Basics - Anfänger-Themen 2
Povlsen84 HashSet mit eigenen Datentypen Java Basics - Anfänger-Themen 6
G HashSet vs. TreeSet Java Basics - Anfänger-Themen 3
G hashset überschreibt werte bei add Java Basics - Anfänger-Themen 1
G Wie mach ich ein HashSet für eigene Objecte? Java Basics - Anfänger-Themen 9
M HashSet Initialisierungsgröße? Java Basics - Anfänger-Themen 5
F doppelte Elemente in HashSet Java Basics - Anfänger-Themen 5
G Probleme mit HashSet Java Basics - Anfänger-Themen 5
S HashSet in HashMap, Zugriff Java Basics - Anfänger-Themen 3
G Zahlen aus HashSet in ein int Array übergeben Java Basics - Anfänger-Themen 15
G Hashset verknüpfen mit BufferedReader Java Basics - Anfänger-Themen 18
L Was ist ein HashSet? Java Basics - Anfänger-Themen 33
G HashSet Java Basics - Anfänger-Themen 21
P HashSet und Referenzen Java Basics - Anfänger-Themen 9
B Warum hat HashSet kein get(Object o) ? Java Basics - Anfänger-Themen 8
H umwandeln zu Hashset ?! Java Basics - Anfänger-Themen 7
ruutaiokwu JRE-/JDK-unabhängige PBKDF2WithHmacSHA512-Implementierung Java Basics - Anfänger-Themen 16
V Hilfe bei Implementierung einer boolean Methode Java Basics - Anfänger-Themen 6
K Fehler bei der Implementierung Java Basics - Anfänger-Themen 6
J Implementierung gcd();square() Java Basics - Anfänger-Themen 98
J Implementierung von Observer und Singleton-Pattern Java Basics - Anfänger-Themen 9
A Implementierung von String toString methode() Java Basics - Anfänger-Themen 4
G Projekt architektur (implementierung) Java Basics - Anfänger-Themen 3
M Implementierung einer getNextId Methode Java Basics - Anfänger-Themen 5
J Implementierung Listen-ADT Java Basics - Anfänger-Themen 131
J Implementierung eines Zustandsdiagramms Java Basics - Anfänger-Themen 19
I GenericQueue / Implementierung als Ringspeicher Java Basics - Anfänger-Themen 4
MiMa Log4j2 implementierung Java Basics - Anfänger-Themen 4
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
G Array implementierung Java Basics - Anfänger-Themen 23
J ANTLR Installierung und Implementierung Java Basics - Anfänger-Themen 2
E Hilfe bei Implementierung von Methoden Java Basics - Anfänger-Themen 10
S SkipList Implementierung Java Basics - Anfänger-Themen 1
J Methoden Suche effiziente Implementierung für eine Methode Java Basics - Anfänger-Themen 3
J Interface Probleme bei der Implementierung Java Basics - Anfänger-Themen 1
E hashCode implementierung Java Basics - Anfänger-Themen 9
S Implementierung der Klasse Konto und Nutzung bereits vorhandener Klassen Java Basics - Anfänger-Themen 7
H Implementierung eines Interfaces erweitern Java Basics - Anfänger-Themen 13
O Generics - Implementierung Java Basics - Anfänger-Themen 7
A Hilfestellung zur Implementierung des Gaußsches Eliminationsverfahren Java Basics - Anfänger-Themen 4
B OOP Implementierung eines Heaps Java Basics - Anfänger-Themen 13
K Bucketsort Implementierung Java Basics - Anfänger-Themen 0
K Mergesort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
K Quicksort Fehler in der Implementierung Java Basics - Anfänger-Themen 2
S Klassen Klassendiagramm Implementierung? Java Basics - Anfänger-Themen 5
J Bucketsort Implementierung Java Basics - Anfänger-Themen 0
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
N Was bedeutet "Implementierung vor dem Client verbergen" bei Design Patterns? Java Basics - Anfänger-Themen 2
T Collections LinkedList<LinkedList<T>> - Implementierung Java Basics - Anfänger-Themen 10
F Implementierung von Interfaces -> Problem mit main Java Basics - Anfänger-Themen 12
D Resourcebundle implementierung Java Basics - Anfänger-Themen 2
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
Q Implementierung von Listenern Java Basics - Anfänger-Themen 4
B Klassen Hilfe bei Implementierung Java Basics - Anfänger-Themen 5
N Compiler-Fehler Comparable / compareTo implementierung Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Binärbaums Java Basics - Anfänger-Themen 3
I Erste Schritte Implementierung der API Java Basics - Anfänger-Themen 2
S Fragen zur Implementierung eines Adressbuches Java Basics - Anfänger-Themen 20
M falsche implementierung von currentTimeMillis() ? Java Basics - Anfänger-Themen 14
G Implementierung eines Kontos Java Basics - Anfänger-Themen 11
M Quicksort implementierung Java Basics - Anfänger-Themen 23
SexyPenny90 Implementierung einer doubly linked list Java Basics - Anfänger-Themen 5
N Binärbaum/Implementierung Java Basics - Anfänger-Themen 9
U Doppelte Interfcae Implementierung Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben