Gibt es eine elegante Möglichkeit, nur eine Entry<K,V>
von HashMap zu erhalten, ohne zu iterieren, wenn der Schlüssel nicht bekannt ist?
Da die Reihenfolge der Einreise nicht wichtig ist, können wir so etwas sagen
hashMapObject.get(zeroth_index);
Obwohl mir bewusst ist, dass es keine solche Get-by-Index-Methode gibt.
Wenn ich den unten erwähnten Ansatz ausprobieren würde , müsste immer noch der gesamte Eintragssatz der Hashmap abgerufen werden .
for(Map.Entry<String, String> entry : MapObj.entrySet()) {
return entry;
}
Vorschläge sind willkommen.
BEARBEITEN: Bitte schlagen Sie eine andere Datenstruktur vor, um die Anforderungen zu erfüllen.
quelle
firstEntry()
Methode nicht in der Schnittstelle definiert,SortedMap
sondern nur inTreeMap
undConcurrentSkipListMap
:(SortedMap
weil es diefirstKey()
Methode hatte.Karten sind nicht geordnet, daher gibt es keinen "ersten Eintrag", und deshalb gibt es auch keine Methode zum Ermitteln des Index für
Map
(oderHashMap
).Sie könnten dies tun:
(Hinweis: Die Suche nach einer leeren Karte wurde weggelassen.)
Ihr Code erhält nicht alle Einträge in der Karte, sondern kehrt sofort mit dem ersten gefundenen Eintrag zurück (und bricht aus der Schleife aus).
So drucken Sie den Schlüssel und den Wert dieses ersten Elements:
Hinweis: Aufrufen
iterator()
bedeutet nicht, dass Sie die gesamte Karte durchlaufen.quelle
LinkedHashMap
Hält die Schlüssel in der Reihenfolge, in der sie eingefügt wurden.Map
Implementierungen wieLinkedHashMap
undTreeMap
haben eine definierte Reihenfolge. (HashMap
nicht).Ich denke, der Iterator ist möglicherweise die einfachste Lösung.
Eine andere Lösung (nicht schön):
Oder doch (nicht besser):
quelle
Werte abrufen, in ein Array konvertieren, erstes Element des Arrays abrufen:
W.
quelle
Warum wollen Sie vermeiden wollen , rufen
entrySet()
sie nicht nicht generell ein völlig neues Objekt mit seinem eigenen Kontext zu schaffen, sondern liefern nur eine Fassade Objekt. Einfach gesagtentrySet()
ist eine ziemlich billige Operation.quelle
Wenn Sie Java 8 verwenden, ist dies so einfach wie findFirst () :
Kurzes Beispiel:
quelle
Wenn Sie die von Ihnen vorgeschlagene API wirklich möchten, können Sie HashMap unterordnen und beispielsweise die Schlüssel in einer Liste verfolgen. Sehen Sie den Punkt darin nicht wirklich, aber es gibt Ihnen, was Sie wollen. Wenn Sie den beabsichtigten Anwendungsfall erläutern, können wir möglicherweise eine bessere Lösung finden.
EDIT: Ich habe mich bewusst nicht mit der generischen Seite befasst ...
quelle
Was meinst du mit "ohne Iteration"?
Sie können die
map.entrySet().iterator().next()
Karte verwenden und würden sie nicht durchlaufen (im Sinne von "Berühren jedes Objekts"). Sie können jedoch keinen erreichen,Entry<K, V>
ohne einen Iterator zu verwenden. Der Javadoc von Map.Entry sagt:Können Sie genauer erklären, was Sie erreichen wollen? Wenn Sie zuerst Objekte behandeln möchten, die einem bestimmten Kriterium entsprechen (z. B. "einen bestimmten Schlüssel haben") und ansonsten auf die verbleibenden Objekte zurückgreifen möchten, sehen Sie sich eine PriorityQueue an . Es ordnet Ihre Objekte basierend auf der natürlichen Reihenfolge oder einer von
Comparator
Ihnen angegebenen benutzerdefinierten Reihenfolge .quelle
Dieser Ansatz funktioniert nicht, da Sie HashMap verwendet haben. Ich gehe davon aus, dass die Verwendung von LinkedHashMap in diesem Fall die richtige Lösung ist.
quelle
Dies würde einen einzelnen Eintrag von der Karte erhalten, der ungefähr so nah wie möglich ist, da "zuerst" nicht wirklich zutrifft.
quelle
Stolperte hier auf der Suche nach dem gleichen ... Ich erinnerte mich dann an die
Iterables
Klasse aus der Guavenbibliothek .So erhalten Sie das "erste" Element :
Iterables.getFirst( someMap.values(), null );
.Im Wesentlichen das Gleiche wie
Map.values().iterator().next()
, aber Sie können auch einen Standardwert (in diesem Fall null) angeben, falls die Karte nichts enthält.Iterables.getLast( someMap.values(), null );
Gibt das letzte Element in der Karte zurück.Iterables.get( someMap.values(), 7, null );
Gibt das 7. Element in der Map zurück, falls vorhanden, andernfalls einen Standardwert (in diesem Fall null).Denken Sie jedoch daran, dass HashMaps nicht bestellt werden. Erwarten Sie also nicht, dass Sie
Iterables.getFirst
den ersten Artikel zurückgeben, den Sie dort hineingeworfen haben ... ebenfalls mitIterables.getLast
. Vielleicht nützlich, um einen zugeordneten Wert zu erhalten.Es lohnt sich vielleicht nicht, die Guava-Bibliothek dafür hinzuzufügen, aber wenn Sie zufällig einige der anderen coolen Dienstprogramme in dieser Bibliothek verwenden ...
quelle
Nach Ihrer Bearbeitung ist hier mein Vorschlag:
Wenn Sie nur einen Eintrag haben, können Sie die Karte durch ein Doppelobjekt ersetzen. Abhängig von den Typen und Ihren Vorlieben:
quelle
quelle
Ich habe die Antwort bekommen: (Es ist einfach)
Nehmen Sie eine ArrayList, setzen Sie sie um und ermitteln Sie die Größe der Arrayliste. Hier ist es :
Es wird die Größe angezeigt. (Vorschlag machen). Es funktioniert.
quelle