2017-05-16 3 views
0

Ich habe ein Problem, wie kann ich es richtig machen? Um einen Schlüsselobjekt und Wertobjekt MapTree ?:TreeMap <Objekt, Objekt> Problem

import java.util.TreeMap; 


public class ClassA { 
    Integer phoneNumber; 
    ClassA(Integer noKey){ 
     this.phoneNumber = phoneNumber; 
    } 



public static void main(String[] args) { 
    TreeMap<ClassA, ClassB> map = new TreeMap<>(); 

    ClassB bob = new ClassB ("bob", "jamaica", 1234567890); 

    map.put (?????,bob); 
} 
} 

class ClassB{ 
    String name, adress; 
    Integer phoneNumber; 

ClassB(String name, String adress, Integer phoneNumber){ 
    this.name = name; 
    this.adress = adress; 
    this.phoneNumber = phoneNumber; 
} 

} 

Wie ich gleiche phonenumber Form classB zu Schlüsseln TreeMap Hexe seines in KlasseA setzen müssen? Ich möchte nicht zu viele Änderungen der Konstruktion meines Codes machen ... Ich meine, ich brauche diese zwei separaten Klassen

+0

meine Java-Fähigkeit (LOW), und in ClassA sollte PhoneNumber im Konstruktor sein .... – Zosia

+0

Es ist eine gute Idee, die natürlichsprachigen Teile von Bezeichnern mit konventionellem, natürlichsprachigem Buchstabieren zu buchstabieren, also 'Adresse' statt' ' Adresse ". Dies erstellt die Angewohnheit, wartbaren Code zu erstellen. –

+0

Wenn Sie die Javadocs für 'Map # put' lesen, sehen Sie, dass das erste Argument eine Referenz auf eine Instanz des Schlüsseltyps ist, in Ihrem Fall' ClassA'. Erstellen Sie also eine Instanz dieses Schlüsseltyps und verwenden Sie sie als Schlüssel im Put-Aufruf. –

Antwort

0

Es sieht aus wie Sie noch nicht ganz verstehen, java. Zunächst einmal verwenden Sie Integer anstelle von int was gut, sollte in Ordnung sein, aber es wird später Probleme verursachen.

Daneben ist der Konstruktor von ClassA nur ein bisschen aus. Sie weisen den Wert phoneNumber sich selbst zu, statt der analysierten Ganzzahl.

Sie sollten sie dies ändern:

class ClassA { 
    int phoneNumber; 
    public ClassA (int newPhoneNumber) { 
     this.phoneNumber = newPhoneNumber; 
    } 
} 

Dies wird den Wert von phonenumber auf der einen zu der Klasse, sondern an sich selbst gegeben zuweisen.

Dann eine Instanz von Klasse A mit der gleichen Telefonnummer wie ClassB zu erstellen, könnten Sie tun, es ist einfach so:

ClassB bob = new ClassB ("bob", "jamaica", 1234567890); 

ClassA phone = new ClassA (bob.phoneNumber); 

map.put (phone, bob); 

Ich hoffe, dass ich helfen war.

+0

thx Mann, einen schönen Tag/Abend :) – Zosia

+0

Die Verwendung von 'Integer' anstelle von' int' verursacht später keine Probleme, obwohl 'String' wohl eine bessere Wahl wäre, um eine Telefonnummer darzustellen. –

1

Ein Weg ist, TreeMap<ClassA, ClassB> zu einem TreeMap<Integer, ClassB> zu ändern, und übergeben Sie die Telefonnummer anstelle einer Instanz von ClassA zu put und get Methoden. Dies nutzt den Vorteil, dass Integer bereits eine natürliche Reihenfolge aufweist (d. H. Es implementiert Comparable<Integer>).

Ein anderer Weg ist ClassA zu ändern Comparable<ClassA> zu implementieren, so dass zwei ClassA Fällen die gleiche Telefonnummer aufweisen, werden durch die TreeMap identisch betrachtet werden. Eine dritte Möglichkeit besteht darin, einen Comparator<ClassA> an den Konstruktor TreeMap zu übergeben. Diese Comparator vergleicht die Telefonnummern von zwei ClassA Instanzen.

Zum Beispiel:

public class ClassAComparator implements Comparator<ClassA> 
{ 
    public int compare (ClassA one, ClassB two) { 
     return Integer.compare(one.getPhoneNumber(),two.getPhoneNumber()); 
    } 
} 

und dann:

TreeMap<ClassA, ClassB> map = new TreeMap<> (new ClassAComparator()); 
+0

Ich verstehe die Frage eindeutig nicht richtig, aber konnten wir nicht etwas wie 'map.put (neue ClassA (bob.getPhoneNumber()), Bob);' durch Hinzufügen eines Getters in ' KlasseB'? –

+0

1. Ich wusste es, aber ich brauche zwei Objekte. 3. Ich verstehe es nicht ... können Sie es beschreiben? – Zosia

+0

@Shashwat das ist nicht genug, wenn ClassA 'Comparable 'nicht implementiert. – Eran