Hashmap und ContainsValue()

Status
Nicht offen für weitere Antworten.

guradon

Mitglied
Hallo,

ich habe ein Problem und schon gegoogelt und bei sun.com in der doku gelesen, aber finde gerade keine Lösung dafür, also hier mal die Frage:

Code:
Map<String,Spieler> Spielerliste = new HashMap<String,Spieler>();
		
public String Spielerregistrieren(String Vorname,String Nachname,String Kontaktdaten)
	{
	Spieler neuerSpieler= new Spieler(Vorname, Nachname, Kontaktdaten);
	SpielerID = neuerSpieler.getSpieler_ID();	

	if((Spielerliste.containsKey(SpielerID))||(Spielerliste.containsValue(neuerSpieler))){
	// abbruch der Erstellung des Spielers
	return "Spieler bereits vorhanden oder ID bereitsvergeben!";
	}
	else{
	Spielerliste.put(SpielerID,neuerSpieler);
    // Spieler wurde zur Liste hinzugefügt!
	 return "Spieler wurde erfolgreich registriert mit ID:"+SpielerID+"!";    
	}}
Das ganze funktioniert soweit, dass alle Einträge ausgegeben werden und bei gleichem Key das neue Objekt nicht in die Hashmap geschrieben wird. Aber wenn ich ein Objekt mit den gleichen Daten(Value) erzeuge, wird es trotz der containsValue() Abfrage in die Hashmap geschrieben. In der vorliegenden Version habe ich noch die ID in der Klasse Spieler drin stehen, aber ich habe es bereits ohne diese Variable getestet und trotzdem geht es nicht.

Code:
public class Spieler {
	String Vorname,Nachname,Kontaktdaten;//Kontaktdaten: Telefon,Adresse,Email 	
	 
	static int Spieler_counter; 
	// dient dazu die ID nach Anzahl der spieler festzulegen wird beim erstellen jedes Spielers erhöht.
	/**
	 * @param vorname
	 * @param nachname
	 * @param spieler_ID
	 */
public Spieler(String vorname, String nachname, String kontaktdaten) {
	    //vorher prüfen ob Spieler in der Liste vorhanden ist.
		super(); // Ka warum der beim automatischen erstellen eines Konstruktors hiern super() schreibt
		Vorname = vorname;
		Nachname = nachname;
		Kontaktdaten = kontaktdaten;
	this.Spieler_increase();
		
	}

Muss ich die containsValue() Methode irgendwie überlagern, damit die Values bekannt sind ?
 
S

SlaterB

Gast
Gegenfrage: welchen guten Grund hast du denn bisher implementiert,
so dass Java erkennen kann, dass zwei Spieler gleich sind?

z.B. eine equals-Operation?
erstelle zwei Spieler mit gleichen Daten und führe
System.out.println("gleich?: "+spieler1.equals(spieler2));
aus,
wenn das nicht geht, dann die Map bestimmt auch nicht
 

guradon

Mitglied
Hey Danke für den Hinweis!
Ich habe jetzt in der Spieler Klasse eine equals Funktion geschrieben, die geht auch mit einzelnen Elementen, ich wollte jetzt mit folgender containsValue Funktion das ganze prüfen:
Code:
public boolean containsValue(Spieler spieler)
         {System.out.println("Spieler bereits vorhanden oder ID bereitsvergeben!");
          Iterator it = Spielerliste.entrySet().iterator(); 
           while (it.hasNext()) {
	      Map.Entry entry = (Map.Entry)it.next();
	      if(entry.equals(spieler)){return true;}
            
        }return false;}
Das klappt aber wieder nicht muss ich beim verwenden von entry noch was beachten?
Die equals Funktion:
Code:
public boolean equals(Spieler spieler){
if((this.Vorname.equals(spieler.Vorname))&&
(this.Nachname.equals(spieler.Nachname))&&
(this.Kontaktdaten.equals(spieler.Kontaktdaten)))
{
 System.out.println("Spielerbereits vorhanden");return true;}
else{System.out.println("Spieler nicht vorhanden");
return false;}}
 
S

SlaterB

Gast
ein Map.Entry ist ein Map.Entry, ein Map.Entry kann niemals deinem Spieler gleich sein,
vergleiche entry.getValue().equals(spieler) oder ähnliches,

aber map bietet doch schon eine Operation containsValue()?

hier der Code aus HashMap, den baust du gerade nach ;) :

Code:
    /**
     * Returns <tt>true</tt> if this map maps one or more keys to the
     * specified value.
     *
     * @param value value whose presence in this map is to be tested.
     * @return <tt>true</tt> if this map maps one or more keys to the
     *         specified value.
     */
    public boolean containsValue(Object value) {
	if (value == null) 
            return containsNullValue();

	Entry[] tab = table;
        for (int i = 0; i < tab.length ; i++)
            for (Entry e = tab[i] ; e != null ; e = e.next)
                if (value.equals(e.value))
                    return true;
	return false;
    }
 

guradon

Mitglied
Hallo,

Ja da hast du Recht.
Muss ich ContainsValue so überschreiben, dass meine eigene equals Funktion verwendet wird, wie kann ich das machen ?
 
S

SlaterB

Gast
es wird die equals-Version des übergebenen Objekts genommen,
gibt Spielerliste.containsValue(neuerSpieler) ein und fertig, so hattest du es ja schon am Anfang

spielerMap wäre übrigens ein besserer Name, Variablen immer klein!
 

guradon

Mitglied
Ok, das Problem ist aber das es mit der obigen equals Funktion nicht geht. Also wenn ich wie du gesagt hast
spielerMap.containsValue(neuerSpieler) aufrufe und die obige equals Funktion verwende, bekomme ich immer nur false. Hab ich bei der euals Funktion was falsch gemacht?
 
S

SlaterB

Gast
stimmt, da war noch was falsch in equals, der Parameter muss zwischen Object sein, so gehts:

Code:
public class Test
{

    public static void main(String[] args)
        throws Exception
    {

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

        Spieler sp1 = new Spieler("a", "b", "c");
        Spieler sp2 = new Spieler("a", "b", "c");
        System.out.println("gleich?: " + sp1.equals(sp2));

        map.put("key", sp1);
        System.out.println("contains: " + map.containsValue(sp2));
    }
}


class Spieler
{
    String Vorname, Nachname, Kontaktdaten;// Kontaktdaten: Telefon,Adresse,Email

    public Spieler(String vorname, String nachname, String kontaktdaten)
    {
        Vorname = vorname;
        Nachname = nachname;
        Kontaktdaten = kontaktdaten;

    }

    public boolean equals(Object o)
    {
        if (!Spieler.class.isInstance(o))
        {
            return false;
        }
        Spieler spieler = (Spieler)o;
        if ((this.Vorname.equals(spieler.Vorname)) && (this.Nachname.equals(spieler.Nachname))
            && (this.Kontaktdaten.equals(spieler.Kontaktdaten)))
        {
            System.out.println("Spielerbereits vorhanden");
            return true;
        }
        else
        {
            System.out.println("Spieler nicht vorhanden");
            return false;
        }
    }
}

Variablen klein schreiben!
 
G

Guest

Gast
Du hast soeben den Vertrag von equals/hashCode gebrochen:

http://java.sun.com/javase/6/docs/api/java/lang/Object.html#equals(java.lang.Object)
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
Hier mein Vorschlag:

Code:
class Spieler
{
	public final String Vorname, Nachname, Kontaktdaten;

	public Spieler(String vorname, String nachname, String kontaktdaten)
	{
		Vorname = vorname;
		Nachname = nachname;
		Kontaktdaten = kontaktdaten;
	}

	public boolean equals(Object obj)
	{
		if (!(obj instanceof Spieler)) return false;

		final Spieler spieler = (Spieler) obj;
		return Vorname.equals(spieler.Vorname)
			&& Nachname.equals(spieler.Nachname)
			&& Kontaktdaten.equals(spieler.Kontaktdaten);
	}
	
	public int hashCode()
	{
		return (Vorname.hashCode() * 37 + Nachname.hashCode()) * 37 + Kontaktdaten.hashCode();
	}
}

Fred
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb remove beim Iterieren einer HashMap Java Basics - Anfänger-Themen 3
F Java Object to Hashmap ? Java Basics - Anfänger-Themen 6
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
G 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

Ähnliche Java Themen

Neue Themen


Oben