HashMap.containsValue - Was ist der Punkt?
Ich habe eine HashMap, und ich brauche zum abrufen eines Elements von seiner integer-Wert. Ich merke, es ist ein containsValue () - Funktion, aber es scheint, ich muss noch Durchlaufen der Karte finden Sie den korrekten index sowieso.
Meine Frage ist, warum verwenden containsValue() ich bin, wenn erforderlich, zu durchqueren ist es danach?
Außerdem bin ich fehlt der Punkt komplett? 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Karte bildet einen Schlüssel auf einen Wert. Wenn Sie einen Wert haben und wissen Sie die Karte enthält dieser Wert, warum brauchen Sie den Schlüssel nicht mehr?
Auf der anderen Seite, wenn Sie wirklich brauchen, den Schlüssel oder Sie haben nur eine Eigenschaft, der Wert, kann man die Iteration der
entrySet()
überprüfen Sie den Wert und den Schlüssel zurück, wenn gefunden:Einer Karte ist ein Schlüssel zu Wert zu speichern. Zu sagen, ein Wert enthalten ist, wird nur als Anhaltspunkt. Ich denke, dass die bijektive link ermöglicht Ihnen das abrufen der Schlüssel von Wert, Sie haben sich auf Dinge wie BiMap von google-Sammlungen
Einer HashMap (oder Anzeigen im Allgemeinen) verwendet Schlüssel/Wert-Paaren. Wenn Sie etwas hinzufügen, um der Karte müssen Sie eine Taste, und es ist dieser Schlüssel, wird später wieder verwendet beim abrufen der Wert. Basierend auf der Implementierung der HashMap, erhält einen Schlüssel, der Abruf eines Wertes erfolgt in O(1) Zeit.
containsValue ist eine nützliche Methode für die Prüfung, ob ein HashMap enthält den Wert, den Sie suchen, aber ich weiß nicht wirklich sehen, warum Sie mit, dass, um den Wert abzurufen, die Sie suchen,??
Den correft Weg, um eine Karte wäre so etwas wie:
Jetzt können Sie Ihre Objekte aus, indem Sie:
Wenn Sie nicht:
myMap.containsValue(1);
dies würde false zurückgeben, als 1, ist der Schlüssel, nicht der Wert. Sie tun konnten:
wenn Sie wollen einfach nur wissen, ob es existiert, aber es ist kein problem in Berufung:
wäre es nur null zurückgeben, wenn es keinen Schlüssel, 99.
Also im Grunde der Punkt ist, Sie sind richtig, es gibt keinen Punkt in mit containsValue wenn Sie versuchen, um den Wert abzurufen. Verwenden Sie get, oder containsKey wenn Sie prüfen wollen, für die Existenz der ersten.
Es ist nicht erforderlich, Durchlaufen Sie danach.
containsValue()
ist hilfreich in Situationen, in denen Sie nicht brauchen, genau zu wissen, wo Sie den Wert, sondern, wenn Sie nur brauchen zu wissen, ob es schon in der Karte. In Situationen, wo Sie brauchen, um wissen genau, wo in der Karte das Wert ist, nicht die Mühe mitcontainsValue()
-- springen direkt zu den iterator, und es finden.können Sie containsValue() in Fällen, in denen Sie nicht brauchen, zu Durchlaufen die gesamte hashmap, zum Beispiel, wenn Sie möchten, hinzufügen von Schlüssel-Wert-paar hashmap, aber vor, dass Sie wissen möchten, ob dieser Wert in der hashmap. In diesem Fall werden für die add-operation, die Sie nicht brauchen, um die traverse ganze hashmap.
Lassen Sie mich reframe diese Frage für Frederik:
Gut, containsValue(), fällt der Vergleich intern (seine input-parameter), mit jedem "Wert" in die hashmap? Oder tut es nutzt irgendwie hashcodeing (oder andere Technik), um das Ergebnis? Für den ersten Fall, wir könnten einfach mit einem iterator zu Durchlaufen und passen Sie die Existenz unserer Wert in der hashmap ist "Wert".
Die Bedeutung der Frage ist in der Leistung oder Geschwindigkeit!
Glaube ich Anzeigen.containsValue ist ein Fehler in der Konstruktion der Karte-Schnittstelle.
Einer sehr gelegentlich trifft auf Map-Implementierungen, die eine " schneller-als-linear Umsetzung von containsValue. Zum Beispiel, eine Karte kann intern repräsentieren jeden einzelnen Wert als eine kleine ganze Zahl und verwenden Sie dann Bitmuster repräsentieren Werte. Eine solche map könnte in der Lage sein, zu erkennen, in konstanter Zeit, es hatte nie einen gegeben Wert vor (wenn es vielleicht noch lineare Zeit, um wieder zu einem bejahenden Ergebnis).
Jedoch, dass eine operation manchmal dauert lineare Zeit und manchmal dauert Konstante Zeit ist nicht eine nützliche Grundlage für einen generischen Algorithmus. Sie können nicht ersetzen, eine LinkedList für eine ArrayList und erwarten, dass die Dinge gut funktionieren, obwohl Sie beide support random access in Ihrer API. Ein client, der benötigt eine Konstante Zeit containsValue pflegen muss eine separate HashSet von Werten, um sicher sein, eine gute Leistung. Kunden zufrieden mit linear-time performance können schreiben Sie einfach die Schleife selbst.
Selbst wenn der Betreuer von der Karte-Schnittstelle auch bedauern hinzufügen, containsValue, es ist natürlich unmöglich für Sie, um es zu entfernen jetzt.