2013-01-03 6 views
16

Wenn ich eine HashMap mit einem solchen Schlüssel: [pubDate, title, link] und einen solchen Wert (Beispiel):Wie ein HashMap Wert mit drei Werten erhalten

[Thu, 03 Jan 2013 21:50:02 +0100, Transferts - YBX : ''Je change de dimension'', http://www.link.fr/info/link_informations.html] 

Kann ich abrufen den Link http://www.link.fr/info/link_informations.html? Code:

for (int i = 0; i < nl.getLength(); i++) { 
        // creating new HashMap 
        map = new HashMap<String, String>(); 
        Element e = (Element) nl.item(i); 
        // adding each child node to HashMap key => value 
        map.put(KEY_TITLE, parser.getValue(e, KEY_TITLE)); 
        map.put(KEY_LINK, parser.getValue(e, KEY_LINK)); 

        map.put(KEY_DATE, parser.getValue(e, KEY_DATE)); 
        //map.put(KEY_DESC, parser.getValue(e, KEY_DESC)); 

        // adding HashList to ArrayList 
        menuItems.add(map); 
} 
+1

Sind diese Klassen mit 3 Mitgliedern oder verketteten Strings oder etwas anderes? –

+1

Zeigen Sie uns etwas Code. – MrSmith42

+0

@Oli Charlesworth: Bitte beachten Sie die bearbeitete Frage. – androniennn

Antwort

17

Sie erstellen ein Objekt, das alle drei Unterschlüssel des Schlüssels als Attribut hält. Stellen Sie sicher, dass Sie equals und hashCode ordnungsgemäß implementieren.

public class MyKey { 
    public MyKey(String subkey1, String subkey2, String subkey3) { 
    ... 
    } 
} 

Verwenden solches Objekt als Schlüssel Ihrer Karte:

Map<MyKey, String> myMap = ....; 
myMap.get(new MyKey("Thu", "03 Jan 2013 21:50:02 +0100", "Transferts - YBX")); 

Viel Spaß!

+0

'Sie erstellen ein Objekt, das alle drei Werte des Schlüssels als Attribute enthält. So rufen Sie die drei Werte einzeln ab. Setzen Sie value1 in a, value2 in b, value3 in c (Beispiel). ? – androniennn

+0

Wo ich sagte "Werte" sollte es lesen "Unterschlüssel" (jetzt korrigiert) – SJuan76

+1

Arbeitete für mich sehr gut, danke !!, um die drei Werte eins nach dem anderen abrufen, können Sie etwas tun, auf Ihre Klasse MyKey die Getter hinzufügen für die Werte, zum Beispiel: getName() {return this.name; } Sobald Sie alle Getter für Ihre Schlüsselklasse haben, können Sie Ihre Map wie folgt iterieren und auf ihre Eigenschaften zugreifen: for (MyKey key: map.keySet()) {key.getName(); key.getLastName(); usw. .} – Israelm

2

Sie könnten einen zusammengesetzten Schlüssel erstellen, der alle gewünschten Werte im Schlüssel enthält. Eine einfache Möglichkeit besteht darin, die Werte Ihres Schlüssels zusammenzufassen, die durch einen Wert getrennt sind, der sicher nicht in den Schlüsselwerten enthalten ist.

ZB:

String makeCompoundKey(String pubDate, String title) { 
    return pubDate + "|" + title; 
} 

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

map.put(makeComoundKey(pubDate,title), link) 

das Problem zu vermeiden, um ein Zeichen zu wählen, die in einem der Schlüsselwerte, nicht erscheint nicht-String Schlüssel und wahrscheinlich für eine bessere Leistung zu handhaben, können Sie erklären eine neue Klasse Ihre Schlüsselwerte enthalten und die equals und hashCode Methoden außer Kraft setzen:

final class DateAndTitle { 
    private final Date pubDate; 
    private final String title; 

    @Overrde 
    boolean equals(Object rhs) { 
    // let eclipse generate this for you, but it will probably look like ... 
    return rhs != null && rhs.getClass() == getClass() && 
     pubDate.equals(rhs.pubDate) && title.equals(rhs.title); 
    } 

    @Overrde 
    int hashCode(Object) { 
    // let eclipse generate this for you... 
    ... 
    } 
} 

Dann können Sie Ihre Karte wie definieren:

HashMap

und verwenden Sie das DateAndTitle-Objekt, um Ihre Karte zu indizieren.

3

Sie könnten auch versuchen, eine verschachtelte hashmap zu verwenden, von der Art HashMap<String, HashMap<String, HashMap<String, String>>>, wo Sie dann Ihre Anfrage formulieren würden als map.get(date).get(title).get(link)

Die beste Lösung wäre dann diesen verschachtelten hashmap in Ihrer eigenen Klasse zu kapseln sein als wie:

0

In meinem Fall fand ich eine andere Lösung: ist eine ArrayList zu erstellen und legen Sie alle Links auf jede for-Schleife. Das ist viel einfacher.

15

Ich habe gerade das gleiche Problem konfrontiert und habe beschlossen, meinen Schlüssel zu einer Entry zuordnen. Dies ermöglicht dieselben Indizierungsfunktionen, die von einer Map bereitgestellt werden, während mehr als eine Eigenschaft mit einem Schlüssel verknüpft ist. Ich denke, es ist eine viel bessere Lösung, eine separate Klasse zu erstellen oder Karten zu verschachteln.

Map<String, Entry<Action, Boolean>> actionMap = new HashMap<String, Entry<Action, Boolean>>(); 

actionMap.put("action_name", new SimpleEntry(action, true)); 

die Daten zu später verwenden:

Entry<Action, Boolean> actionMapEntry = actionMap.get("action_name"); 

if(actionMapEntry.value()) actionMapEntry.key().applyAction(); 

Meine persönlichen Gebrauch davon war eine Karte von genannten Funktionen. Nach Auswahl der Funktion anhand des Namens würde die Funktion ausgeführt und der Boolesche Wert würde bestimmen, ob eine Bereinigung bei der Verarbeitung benötigt wurde oder nicht.

+1

Ich weiß, es ist ein paar Jahre, aber ich fühle, dass diese Informationen nützlich für diejenigen sind, die immer noch nach Lösungen suchen. – ndm13

+1

Du hast meinen Tag gerettet, danke Kumpel! – LePhleg

Verwandte Themen