Collections Suche Collection, um Strings mit Indizees versehen

J

JustNobody

Top Contributor
Ja, genau so war es gemeint. Statt Tupel ist es aber eigentlich ein Tripel, oder? Aber schon deutlich besserer Name als mein Value.

@mrBrown danke für den Hinweis. Ich war ehrlich gesagt schon etwas über diese Anwendung überrascht.... auf die Idee muss man erst einmal kommen - aber man lernt ja nie aus :)
 
J

JustNobody

Top Contributor
Oh ja, man sollte erst recherchieren und dann schreiben. Das würde so Blamagen vermeiden. :)

Der Begriff Tupel wird in der Informatik für geordnete Wertesammlungen (eindimensionale Arrays) und – insbesondere in der relationalen Algebra – als Synonym für Datensatz verwendet.


Also von Dir vollkommen richtig benutzt und war mein Fehler, da ich als Tupel nur eine vorhandene Klasse mit genau 2 Elementen vor Augen hatte.
 
W

White_Fox

Top Contributor
Naja...das war Zufall meinerseits, genau wußte ich es ja auch nicht. Tupel habe ich gewählt weil ich mir nicht sicher war, ob es Tripel als Begriff überhaupt gibt. Ich hab da auch ehrlich gesagt nicht sehr viel nachgedacht, bevor du gefragt hast.

Auf jeden Fall danke ich für die Nachfrage und den Denkanstoß.
 
W

White_Fox

Top Contributor
Guten Abend allerseits

Ich werd gerade leicht wahnsinnig...findet jemand den Fehler? Meine Klasse sieht momentan etwa so aus:
Java:
public class SynchronizedDoubleKeyHashmap<K1, K2, V> {
    private class Tupel{
        K1 k1;
        K2 k2;
        V v;
       
        private Tupel(K1 k1, K2 k2, V v) {
            this.k1 = k1;
            this.k2 = k2;
            this.v = v;
        }
    }
   
    private HashMap<K1, Tupel> key1Map;
    private HashMap<K2, Tupel> key2Map;

    SynchronizedDoubleKeyHashmap() {
        key1Map = new HashMap<>();
        key2Map = new HashMap<>();
    }
   
    private boolean containsKey1(K1 key1){
        return key1Map.containsKey(key1);
    }
   
    private boolean containsKey2(K2 key2){
        return key2Map.containsKey(key2);
    }
   
    private void removeTupel(K1 k1, K2 k2){
        key1Map.remove(k1);
        key2Map.remove(k2);
    }

    synchronized void put(K1 k1, K2 k2, V v){
        if(containsKey1(k1) | containsKey2(k2)){
            removeTupel(k1, k2);
        }
        Tupel tupel = new Tupel(k1, k2, v);
        key1Map.put(k1, tupel);
        key2Map.put(k2, tupel);
    }
   
    synchronized V getForK1(K1 key){
        return key1Map.get(key).v;
    }
   
    synchronized V getForK2(K2 key){
        return key2Map.get(key).v;
    }
   
    synchronized V removeWithK1(K1 key){
        Tupel tupel = key1Map.remove(key);
        key2Map.remove(tupel.k2);
        return tupel.v;
    }

    synchronized V removeWithK2(K2 key){
        Tupel tupel = key2Map.remove(key);
        key1Map.remove(tupel.k1);
        return tupel.v;
    }
   
    synchronized boolean isEmpty(){
        return key1Map.isEmpty() & key2Map.isEmpty();
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof SynchronizedDoubleKeyHashmap){
            SynchronizedDoubleKeyHashmap otherMap = (SynchronizedDoubleKeyHashmap) obj;
           
            return this.key1Map.equals(otherMap.key1Map) &&
                    this.key2Map.equals(otherMap.key2Map);
        }
        return false;
    }
}

Für diese Klasse gibt es nun einen Unittest, und folgender Testcase schlägt ständig fehl - ich verstehe nicht, warum. Sieht jemand das Problem?

Java:
@Test
    public void testEquals() {
        SynchronizedDoubleKeyHashmap<String, Integer, String> instance, otherMap;
        String key1a, key1b;
        Integer key2a, key2b;
        String valueA, valueB;
        
        System.out.println("equals");
        
        key1a = "Some key";
        key1b = "Some other key";
        key2a = 23;
        key2b = 777;
        valueA = "Some value";
        valueB = "Some other value";
        
        instance = new SynchronizedDoubleKeyHashmap<>();
        instance.put(key1a, key2a, valueA);
        instance.put(key1b, key2b, valueB);
        
        otherMap = new SynchronizedDoubleKeyHashmap<>();
        otherMap.put("Different Key", key2a, valueA);
        otherMap.put(key1b, key2b, valueB);
        assertFalse(instance.equals(otherMap));
        
        otherMap = new SynchronizedDoubleKeyHashmap<>();
        otherMap.put(key1a, 999, valueA);
        otherMap.put(key1b, key2b, valueB);
        assertFalse(instance.equals(otherMap));
        
        otherMap = new SynchronizedDoubleKeyHashmap<>();
        otherMap.put(key1a, key2a, "Different Value");
        otherMap.put(key1b, key2b, valueB);
        assertFalse(instance.equals(otherMap));
        
        otherMap = new SynchronizedDoubleKeyHashmap<>();
        otherMap.put(key1a, key2a, valueA);
        otherMap.put(key1b, key2b, valueB);
        assertTrue(instance.equals(otherMap));        //Fehler, equals() liefert hier false
    }
 
T

thecain

Top Contributor
Tupel müsste doch auch ein equals und hashcode implementieren

Und noch 2 Tipps:

Ich würde Test immer 3 stufig aufbauen. arrange - act - assert. Dann ein neuer Test. nicht immer ändern und neu asserten.

Zudem, wenn equals überschrieben wird, immer auch hashcode überschreiben.
 
J

JustNobody

Top Contributor
Dein Tupel hat kein equals.

Da Du beim Insert immer ein neues Tupel erzeugst haben die HashMaps zwar gleiche Keys, aber unterschiedliche Tupel.
 
L

LimDul

Top Contributor
Du hast übrigens in der Map überall nur die bitweisen Und/Oder Operatoren verwendet - da sollten mit Sicherheit aber die logischen sein (also && anstelle von & verwenden und || anstelle von |)
 
W

White_Fox

Top Contributor
Oh man...ja, Tupel und equals, sicher...

Zudem, wenn equals überschrieben wird, immer auch hashcode überschreiben.
Hm...warum? Ich habe mich schon über die Autofunktion gewundert, die equals() und hashcode() gleichzeitig überschreibt, mich darüber aber eher immer gewundert. Daß sich die JVM um den Hash kümmert war mir bisher immer sehr recht.
Welchen Hintergrund hat das?
 
J

JustNobody

Top Contributor
Es muss gelten: Wenn equals() wahr ist, dann muss der Hashcode gleich sein.
(Wenn equals nicht wahr ist, dann ist der hashcode natürlich egal.)

Hintergrund ist, wie der Hashcode genutzt wird bzw. genutzt werden kann. Bestes Beispiel ist die HashMap. Für jeden Key wir der HashCode genommen und dann auf Basis des HashCodes der Key abgelegt (z.B. in einem Array aus Listen mit Länge n und hashcode % n wäre die Position im Array.) Wenn Du nun zwei Instanzen hast, die gleich sind aber unterschiedliche HashCodes hast, dann kannst Du den Key über die zweite Instanz nicht wieder auffinden, weil an der falschen Stelle gesucht würde.

Generell kann man sich z.B. Lombok ansehen. Das nutze ich in der Regel um gewisse Dinge zu bauen. Dann wird sowas relativ einfach ein

Code:
@Data
@AllArgsConstructor
private class Tupel {
        K1 k1;
        K2 k2;
        V v;
}

@Data beinhaltet mehrere Annotations: Getter, Setter, EqualsAndHashcode, ToString und RequiredArgsConstructor

Falls Du das anschauen möchtest: https://projectlombok.org/

Lombok hat den großen Vorteil, dass es nur eine Compile-Zeit Abhängigkeit ist (Also man braucht es später nicht mehr) und es bietet ein "Delombok", das einem den Code als Code erzeugt, so dass man jederzeit Lombok als Abhängigkeit wieder los werden kann.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
BTW: Statt Lombok bieten sich da auch Records an, noch kürzer und ohne externe Abhängigkeit :)
Java:
private record Tupel(K1 k1, K2 k2, V v) {}
 
J

JustNobody

Top Contributor
BTW: Statt Lombok bieten sich da auch Records an, noch kürzer und ohne externe Abhängigkeit :)
Java:
private record Tupel(K1 k1, K2 k2, V v) {}
So man Java 14 nutzen kann: Auf jeden Fall....

Wenn man so ein armes Schwein ist, das noch mit Java 8 arbeiten darf, dann wünscht man sich 11 und träumt noch nicht einmal von Records :)
 
W

White_Fox

Top Contributor
Mal eine Frage: Wie würdet ihr einen Hashcode für die Tupel-Klasse implementieren?

Ich hätte als Vorschlag z.B.:
return k1 + 2*k2 + 3*v;
Ich bin mir aber nicht wirklich sicher, ob das nicht rasch zu Kollisionen führen kann. Und was ist mit Überläufen, wenn k2 oder v mal einen recht großen Hash mitbringen?
 
J

JustNobody

Top Contributor
Hashcodes statt addieren einfach per xor verbinden ... das mit der Multiplikation kann man durch ein shiften ersetzen. Ein *2 ist ein shift um eins. Du könntest also prinzipiell dann ein Wert um 1 und den anderen um 2 Bit verschieben.

Das wäre eine Idee, die denkbar wäre.
 
mrBrown

mrBrown

Super-Moderator
Mitarbeiter
Der Algorithmus aus Effective Java bietet sich da an.
result mit dem Hashcode des ersten Felds initialisieren, für jedes weitere Feld dann result=31*result+Hashcode des Feldes
 
W

White_Fox

Top Contributor
@thecain
Ich bin wirklich begeistert.
Java:
@Override
public int hashCode() {
    Object[] members = new Object[]{k1, k2, v};
    return members.hashCode();
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Suche Scripter für alt:V Project! Allgemeine Java-Themen 0
D Suche Quellcode! Allgemeine Java-Themen 8
O Suche Unterstützung für ein OpenSource-Projekt (grafischer Editor) Allgemeine Java-Themen 13
B Bei Email: FW / AW... - Hilfe bei String suche Allgemeine Java-Themen 21
J Suche Alternative zu Jasper Reports Allgemeine Java-Themen 4
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
M Suche Alternative zu JFreeChart Allgemeine Java-Themen 11
S Warmup für Lineare-Suche mit Zeitmessung Allgemeine Java-Themen 2
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
B Suche nach einem Testprogramm für meine BA Allgemeine Java-Themen 0
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
O Suche größeres Beispiel für WebserverAnwendung mit Java Allgemeine Java-Themen 2
G Google-Suche ist nicht auslesbar?! Allgemeine Java-Themen 18
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
L Suche nach CalDav Server API Allgemeine Java-Themen 0
HarleyDavidson Best Practice Suche "Container" für Modulapplikationen Allgemeine Java-Themen 0
S Suche Konzept: Korrektheit des Aufrufers feststellen Allgemeine Java-Themen 7
KaffeeFan Methoden Suche Methode um Programm kurz warten zu lassen Allgemeine Java-Themen 22
B Suche geeignete Datenstruktur Allgemeine Java-Themen 5
L Erste Schritte Suche Java Wiki System? Allgemeine Java-Themen 5
L Suche Geräte für Java SE Embedded Allgemeine Java-Themen 0
S Rekursive Suche in einem Netz Allgemeine Java-Themen 5
F Über Java Google Suche nutzen Allgemeine Java-Themen 11
A Suche Android Programmierer Allgemeine Java-Themen 0
W Suche Framework zur Prüfung von IPv4 und IPv6 Allgemeine Java-Themen 2
A Java - Suche nach Datensatz mit DateChooser Allgemeine Java-Themen 0
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
M Suche Framework/API für Monitoring-Anwendung Allgemeine Java-Themen 3
F Suche kostenlose GUI für Eclipse Allgemeine Java-Themen 10
H Suche mit Wildcards und boolschen Operatoren Allgemeine Java-Themen 4
B Suche passende Datenstruktur für 2 Einträge Allgemeine Java-Themen 19
A Binäre Suche im Array mit StackOverflowError Allgemeine Java-Themen 3
T Verkettete Suche Allgemeine Java-Themen 6
S RxTx - langsame Port suche Allgemeine Java-Themen 3
D Suche Matrix Libraries Allgemeine Java-Themen 11
S Suche Dependency Injection Container Allgemeine Java-Themen 6
J Suche: Tool zum Auffinden gleichnamiger Klassen (Name und Package gleich) in unteschiedlichen JARs Allgemeine Java-Themen 5
BinaryLogic Input/Output Suche Wörterbuch-Datei Einzahl/Mehrzahl Allgemeine Java-Themen 2
A Suche Algorithmus zum Erstellen eines planaren Graphen Allgemeine Java-Themen 5
D Suche Librarys ähnlich datatables.net + Login Allgemeine Java-Themen 3
Gossi Threads Suche ein (einfaches) Beispiel Allgemeine Java-Themen 5
P Erste Schritte Suche in ArrayList mit Maps Allgemeine Java-Themen 4
F Suche Performanceoptimierung bei Stringsortierung Allgemeine Java-Themen 51
B Suche Datenquelle für lizenz-informationen Allgemeine Java-Themen 5
J Lucene suche in Json (CouchDB) Allgemeine Java-Themen 2
X Suche Softwareimplementierung von Cryptographischen Algorithmen Allgemeine Java-Themen 3
S Suche Tipps für Einstieg in JavaCC Allgemeine Java-Themen 2
R Suche in logfiles mit Lucene / Solr Allgemeine Java-Themen 2
P Suche Datenstruktur Allgemeine Java-Themen 2
M Suche Java-Projekt zum Thema Elektrotechnik Allgemeine Java-Themen 6
F Suche Begriff Allgemeine Java-Themen 2
hdi Suche Icon-Sammlung Allgemeine Java-Themen 7
G Suche "richtiges" Framework/Library Allgemeine Java-Themen 14
slawaweis Suche Klassen für Event Managment und Time Allgemeine Java-Themen 2
P Probleme mit wikipedia quellcode zur binären Suche Allgemeine Java-Themen 6
C Suche Permutationsalgo Allgemeine Java-Themen 6
E Suche nach Foto-Dummy Allgemeine Java-Themen 8
B Suche Paket zum auslesen von Metadaten von Bildern. Allgemeine Java-Themen 4
N suche globale Tastenabfrage Allgemeine Java-Themen 6
P SUCHE: gute Geo Library (freeware) Allgemeine Java-Themen 2
P Suche performante PDF Library Allgemeine Java-Themen 20
data89 Bilder mit Java prüfen - suche dringend Hilfe Allgemeine Java-Themen 8
faetzminator Regex zur Suche von "value-losen" Attributen in HTML Tags Allgemeine Java-Themen 7
S Suche im JTree nach Neuaufbau Allgemeine Java-Themen 4
W Problem bei der Suche (binarySearch) vom deutschen Sonderzeichen "ß" im einem Array Allgemeine Java-Themen 6
D Suche nach passender Datenstruktur Allgemeine Java-Themen 4
S suche library die diagramme darstellen kann Allgemeine Java-Themen 2
T Suche Anhaltspunkt für plattformübergreifende, "unique machine id" ... Allgemeine Java-Themen 12
P WebSerive Suche Allgemeine Java-Themen 15
hdi Suche nach Begriff aus der Programmierung Allgemeine Java-Themen 11
X Suche Java Klasse die Feiertage berechnen kann Allgemeine Java-Themen 2
B suche Deutsche Übersetzung für neuste Eclipse Version Allgemeine Java-Themen 6
Daniel_L Suche nach ganzen Wörtern (wholeword) in Strings? Allgemeine Java-Themen 4
G Regex-Suche nach Worten Allgemeine Java-Themen 3
Antoras Suche Projektarbeit für Gruppe mit 3 Leuten Allgemeine Java-Themen 5
G Perfomante Suche in grosser Datei Allgemeine Java-Themen 6
T Suche Tool Allgemeine Java-Themen 11
D Suche sowas wie Map nur für mehrere Werte Allgemeine Java-Themen 13
D Suche Hilfe zum Rechnerübergreifenden Dateizugriff. Allgemeine Java-Themen 3
M suche speziellen Sortieralgorithmus Allgemeine Java-Themen 3
E javax.comm: Suche eine open source Alternative zu rxtx Allgemeine Java-Themen 8
J Suche regex-Pattern fuer Liste von Zahlen zwischen 0-100 Allgemeine Java-Themen 6
T Suche den großen Calendar Thread ! Allgemeine Java-Themen 2
P Suche Benis IP/Netzwerkadresse JTExtField Allgemeine Java-Themen 2
J Suche Doku um generischen Code zu erstellen. Allgemeine Java-Themen 9
G suche Property alternative Allgemeine Java-Themen 4
C Fehler im Quellcode. Suche in einem Baum Allgemeine Java-Themen 3
S Suche Pendant zu einem VB Befehl Allgemeine Java-Themen 2
T Suche gute JAVA Steuerelemente Allgemeine Java-Themen 2
V Suche RegEx zu (gelöstem) Problem Allgemeine Java-Themen 3
B Suche Browser-Control Allgemeine Java-Themen 4
G Suche Programmierumgebung mit Appletviewer Allgemeine Java-Themen 16
G Suche kostenlosen c++ to java converter. Allgemeine Java-Themen 3
P Problem: Suche nach einem Begriff Allgemeine Java-Themen 5
S Suche schnellen Container Typ Queue Allgemeine Java-Themen 7
K Suche alle Objekte einer bestimmten Klasse Allgemeine Java-Themen 2
P DB suche und eintragen Allgemeine Java-Themen 11
E Suche nach der jüngsten Datei. Allgemeine Java-Themen 19
D Suche Programm, zum anzeigen von Threads und JVM Zustand etc Allgemeine Java-Themen 8

Ähnliche Java Themen

Anzeige

Neue Themen


Oben