Warum hat java.util.Set nicht get (int index)?

237

Ich bin mir sicher, dass es einen guten Grund gibt, aber könnte jemand bitte erklären, warum die java.util.SetSchnittstelle fehlt get(int Index), oder eine ähnliche get()Methode?

Es scheint, dass Sets großartig sind, um Dinge hinein zu bringen, aber ich kann keinen eleganten Weg finden, um einen einzelnen Gegenstand daraus abzurufen.

Wenn ich weiß, dass ich das erste Element haben möchte, kann ich es verwenden set.iterator().next(), aber ansonsten muss ich es anscheinend in ein Array umwandeln, um ein Element an einem bestimmten Index abzurufen.

Was sind die geeigneten Methoden zum Abrufen von Daten aus einem Satz? (außer mit einem Iterator)

Ich bin sicher, dass die Tatsache, dass es von der API ausgeschlossen ist, bedeutet, dass es einen guten Grund gibt, dies nicht zu tun - könnte mich bitte jemand aufklären?

EDIT: Einige sehr gute Antworten hier und einige sagen "mehr Kontext". Das spezifische Szenario war ein dbUnit-Test, bei dem ich vernünftigerweise behaupten konnte, dass der von einer Abfrage zurückgegebene Satz nur 1 Element enthielt, und ich versuchte, auf dieses Element zuzugreifen.

Die Frage ist jedoch ohne das Szenario zutreffender, da sie fokussierter bleibt:

Was ist der Unterschied zwischen Soll- und Liste .

Vielen Dank an alle für die fantastischen Antworten unten.

Marty Pitt
quelle
1
Warum würden Sie ein Element aus einer Menge nach Index erhalten? Versuchen Sie, einen Satz als sortiertes Array zu verwenden?
MSN
Die spezielle Instanz hier ist ein dbUnit-Test für einen Satz, der von einem Aufruf im Ruhezustand zurückgegeben wurde. In meinem Test ist es vernünftig anzunehmen (weil ich es behaupte), dass das zurückgegebene Objekt aufgrund meines IDataSet, das ich zum Einrichten verwendet habe, in einer bestimmten Reihenfolge vorliegt. Es ist ein nicht typischer Fall, führt aber zu meiner Neugier bezüglich der API.
Marty Pitt
1
Das Hinzufügen von Dingen in einer bestimmten Reihenfolge bedeutet nicht, dass dies auch so bleibt, es sei denn, Sie verwenden eine benutzerdefinierte Set-Implementierung.
Michael Myers
1
"Wenn ich weiß, dass ich das erste Element möchte, kann ich set.iterator (). Next () verwenden." - Diese Zeile ist eigentlich nicht sinnvoll. Sie sagen wirklich: "Wenn ich weiß, dass ich das erste Element möchte, kann ich nach der Definition des ersten Elements durch die Implementierung ...". Set selbst ist ungeordnet, daher ist ein indizierter Zugriff nicht sinnvoll. Wenn es nun ein ArrayListSet gäbe, wäre das sinnvoller (einfach in "Liste" umwandeln und glücklich sein). Vielleicht könnten Sie mehr Kontext für die Frage geben?
Jsight
Set ist nicht ungeordnet! Bestimmte Implementierungen davon sind, aber einige Implementierungen sind explizit auf eine bestimmte Weise angeordnet.
Reinierpost

Antworten:

176

Weil Sets keine Bestellung haben. Einige Implementierungen tun dies (insbesondere diejenigen, die die java.util.SortedSetSchnittstelle implementieren ), aber das ist keine allgemeine Eigenschaft von Mengen.

Wenn Sie versuchen, Sets auf diese Weise zu verwenden, sollten Sie stattdessen eine Liste verwenden.

Michael Myers
quelle
10
@matt b: Nein, ich denke er sollte darüber nachdenken. Denken ist gut. ;)
Michael Myers
10
Betrachten Sie es, dann tun Sie es.
Joe Phillips
21
"Überlegen" ist die richtige Formulierung. Es gibt zwei mögliche Probleme: (a) Er verwendet ein Set, wenn er etwas anderes verwenden soll, oder (b) Er versucht, Dinge mit Sets zu tun, die sie nicht unterstützen, die er aber auf andere Weise tun könnte. Es ist gut zu überlegen, welche davon der Fall ist.
Kenj0418
6
Möglicherweise ist die einfachere Antwort die Verwendung eines sortierten Satzes. (Ich gehe davon aus, dass die Einzigartigkeit bei der Auswahl des Sets eine Rolle gespielt hat). Aber ich habe eine Frage, da SortedSet bestellt ist, warum gibt es keine get-Methode in der API.
uncaught_exceptions
5
@HDave: Nein, die Tatsache, dass mehrere Implementierungen einer Datenstruktur eine Eigenschaft gemeinsam nutzen, macht sie nicht zu einer Eigenschaft der Datenstruktur selbst. Zwei der drei häufig verwendeten Implementierungen von List (ArrayList und Vector) sind Direktzugriffe, aber dies macht den Direktzugriff nicht zu einer Eigenschaft von Listen.
Michael Myers
74

Tatsächlich ist dies eine wiederkehrende Frage beim Schreiben von JavaEE-Anwendungen, die Object-Relational Mapping verwenden (z. B. mit Hibernate). und von allen Leuten, die hier geantwortet haben, ist Andreas Petersson der einzige, der das eigentliche Problem verstanden und die richtige Antwort darauf gegeben hat: Java fehlt eine UniqueList! (oder Sie können es auch OrderedSet oder IndexedSet nennen).

Maxwing erwähnte diesen Anwendungsfall (in dem Sie bestellte UND eindeutige Daten benötigen) und schlug das SortedSet vor, aber dies ist nicht das, was Marty Pitt wirklich brauchte.

Dieses "IndexedSet" ist NICHT dasselbe wie ein SortedSet - in einem SortedSet werden die Elemente mithilfe eines Komparators (oder anhand ihrer "natürlichen" Reihenfolge) sortiert.

Stattdessen ist es näher an einem LinkedHashSet (was auch andere vorgeschlagen haben) oder noch mehr an einem (ebenfalls nicht vorhandenen) "ArrayListSet", da es garantiert, dass die Elemente in der Reihenfolge zurückgegeben werden, in der sie eingefügt wurden.

Aber das LinkedHashSet ist eine Implementierung, keine Schnittstelle! Was benötigt wird, ist eine IndexedSet (oder ListSet oder OrderedSet oder UniqueList) Schnittstelle! Auf diese Weise kann der Programmierer angeben, dass er eine Sammlung von Elementen mit einer bestimmten Reihenfolge und ohne Duplikate benötigt, und diese dann mit einer beliebigen Implementierung (z. B. einer von Hibernate bereitgestellten Implementierung) instanziieren.

Da JDK Open Source ist, wird diese Schnittstelle möglicherweise endlich in Java 7 enthalten sein ...

Sorin Postelnicu
quelle
3
Gute Antwort, aber was machen wir in der Zwischenzeit?
HDave
Sicher ist es das. Ich habe List als Manytomany und Onetomany ORM im Ruhezustand verwendet. Ich bin auf ein Problem (oder einen Fehler) gestoßen, als bei einer Abfrage für Linksverknüpfungen, an der mehr als 3 verwandte Entitäten beteiligt waren, eine Ausnahme ausgelöst wurde. Weitere Informationen finden Sie hier ( jroller.com/eyallupu/entry/… ). Um dieses Problem zu umgehen, muss set as ORM Mapping Collection verwendet werden. Aber ehrlich gesagt ist Set nicht praktisch für den Zugriff in der Programmierung und auch dann, wenn Sie eine Bestellsammlung benötigen. Was wir wirklich brauchen, ist "indexedset" wie Sorin Postelnicu, SORT und UNIQUE
horaceman
2
Apache Commons Collections hat genau ListOrderedSetdas, was das OP vor 7 Jahren brauchte (und ich brauchte es heute).
Paul
@ Paul: Das ist in der Tat etwas, das wirklich gut aussieht. Leider hat es immer noch 3 Nachteile: 1) Es ist eine Klasse, keine Schnittstelle. 2) Es ist nicht im JDK. 3) Es ist nicht das, was Hibernate-Abfragen zurückgeben.
Sorin Postelnicu
Ja, aber abgesehen von diesen 3 großen Nachteilen ist es perfekt! :) Im Nachhinein hätte ich meinen Kommentar zu der Frage und nicht zu Ihrer Antwort posten sollen - ich habe abgeschaltet What is needed is an IndexedSet (or ListSet, or OrderedSet, or UniqueList)...und ignoriert ...interface. Das tut mir leid!
Paul
29

Fügen Sie nur einen Punkt hinzu, der in der Antwort von mmyers nicht erwähnt wurde .

Wenn ich weiß, dass ich das erste Element haben möchte, kann ich set.iterator (). Next () verwenden, aber ansonsten muss ich anscheinend in ein Array umwandeln, um ein Element an einem bestimmten Index abzurufen.

Was sind die geeigneten Methoden zum Abrufen von Daten aus einem Satz? (außer mit einem Iterator)

Sie sollten sich auch mit der SortedSetSchnittstelle vertraut machen (deren häufigste Implementierung ist TreeSet).

Ein SortedSet ist ein Set (dh Elemente sind eindeutig), das durch die natürliche Reihenfolge der Elemente oder durch Verwendung einiger Elemente geordnet bleibt Comparator. Sie können einfach mit first()und last()Methoden auf das erste und letzte Element zugreifen . A ist von Zeit SortedSetzu Zeit nützlich, wenn Sie Ihre Sammlung sowohl duplikationsfrei als auch auf bestimmte Weise bestellt halten müssen.

Bearbeiten : Wenn Sie ein Set benötigen, dessen Elemente in Einfügereihenfolge gehalten werden (ähnlich wie bei einer Liste), schauen Sie sich das an LinkedHashSet.

Jonik
quelle
Ich mag LinkedHashSet selbst. Aber ja, das ist gut zu erwähnen. +1
Michael Myers
Danke, ich habe die Antwort ein wenig optimiert. (Scheint, ich hatte einige Aspekte von TreeSet mit denen von LinkedHashSet verwechselt.)
Jonik
25

Diese Art von führt zu der Frage, wann Sie ein Set verwenden sollten und wann Sie eine Liste verwenden sollten. Normalerweise lautet der Rat:

  1. Wenn Sie bestellte Daten benötigen, verwenden Sie eine Liste
  2. Wenn Sie eindeutige Daten benötigen, verwenden Sie ein Set
  3. Wenn Sie beides benötigen, verwenden Sie entweder: ein SortedSet (für vom Komparator geordnete Daten) oder ein OrderedSet / UniqueList (für durch Einfügen geordnete Daten). Leider verfügt die Java-API noch nicht über OrderedSet / UniqueList.

Ein vierter Fall, der häufig auftritt, ist, dass Sie keine benötigen. In diesem Fall sehen Sie einige Programmierer mit Listen und einige mit Sets. Persönlich finde ich es sehr schädlich, Set als Liste ohne Bestellung zu sehen - weil es wirklich ein ganz anderes Tier ist. Bevorzugen Sie immer Listen, es sei denn, Sie benötigen Dinge wie Eindeutigkeit oder Gleichheit.

Seidenschwanz
quelle
2
Wenn Sie nicht spezifisch sind, akzeptieren Sie Collection <T> oder sogar Iterable <T> und initialisieren Sie sie als Liste.
Andreas Petersson
Dies wäre eine Tasche oder ein Multiset. Aber Java unterstützt diese nicht. Sie sagen, Sie sollten nur Collection <T> direkt verwenden.
Mechanische Schnecke
4. Sie benötigen nicht eindeutige Daten und kümmern sich nicht um die Reihenfolge. Sie können kein Set verwenden. Eine Liste, eine Tasche oder ein Multiset funktionieren.
Andrew Gallasch
17

Ich bin nicht sicher, ob jemand es genau so geschrieben hat, aber Sie müssen Folgendes verstehen:

Es gibt kein "erstes" Element in einer Menge.

Denn wie andere gesagt haben, haben Sets keine Bestellung. Eine Menge ist ein mathematisches Konzept, das speziell keine Bestellung enthält.

Natürlich kann Ihr Computer nicht wirklich eine Liste von Dingen speichern, die nicht im Speicher bestellt sind. Es muss etwas bestellt werden. Intern ist es ein Array oder eine verknüpfte Liste oder so. Aber Sie wissen nicht wirklich, was es ist, und es hat nicht wirklich ein erstes Element; Das Element, das "zuerst" herauskommt, kommt zufällig auf diese Weise heraus und ist möglicherweise beim nächsten Mal nicht das erste. Selbst wenn Sie Schritte unternommen haben, um ein bestimmtes erstes Element zu "garantieren", kommt es immer noch zufällig heraus, weil Sie es gerade für eine bestimmte Implementierung eines Sets richtig gemacht haben. Eine andere Implementierung funktioniert möglicherweise nicht so mit dem, was Sie getan haben. Tatsächlich kennen Sie die von Ihnen verwendete Implementierung möglicherweise nicht so gut wie Sie denken.

Die Leute stoßen auf dieses ALL. DAS. ZEIT. mit RDBMS-Systemen und nicht verstehen. Eine RDBMS-Abfrage gibt eine Reihe von Datensätzen zurück. Dies ist der gleiche Satztyp aus der Mathematik: eine ungeordnete Sammlung von Elementen, nur in diesem Fall handelt es sich bei den Elementen um Datensätze. Ein RDBMS-Abfrageergebnis hat überhaupt keine garantierte Reihenfolge, es sei denn, Sie verwenden die ORDER BY-Klausel, aber die Leute gehen davon aus, dass dies der Fall ist, und stolpern eines Tages, wenn sich die Form ihrer Daten oder ihres Codes geringfügig ändert und der Abfrageoptimierer funktioniert auf eine andere Weise und plötzlich kommen die Ergebnisse nicht in der erwarteten Reihenfolge heraus. Dies sind normalerweise die Personen, die in der Datenbankklasse (oder beim Lesen der Dokumentation oder der Tutorials) nicht darauf geachtet haben, als ihnen im Vorfeld erklärt wurde, dass die Abfrageergebnisse keine garantierte Reihenfolge haben.

Skiphoppy
quelle
Heh, und natürlich ändert sich die Reihenfolge normalerweise direkt nach dem Start des Codes, wenn er zu langsam ist. Deshalb fügen sie einen Index hinzu, um die Abfrage zu beschleunigen. Jetzt läuft der Code schnell, gibt aber die falschen Antworten. Und niemand bemerkt es drei oder vier Tage lang ... wenn Sie Glück haben. Wenn Sie kein Glück haben, bemerkt niemand für einen Monat ...
TMN
Ich glaube nicht, dass er das verpasst hat (vielleicht war er mit der Notation schlampig). Er möchte nicht das erste Element aus der Menge, er möchte ein beliebiges Element aus der Menge. Sie können ihm ein beliebiges Element geben, da es Setist Iterable.
Elazar Leibovich
Sie sprechen von get (index) by index. Was ist mit einem Get (Object) durch Gleichheit?
Kumar Manish
10

In den Standard-Java-Sammlungen fehlen einige Datenstrukturen.

Tasche (wie Set, kann aber mehrfach Elemente enthalten)

UniqueList (geordnete Liste, kann jedes Element nur einmal enthalten)

Anscheinend benötigen Sie in diesem Fall eine eindeutige Liste

Wenn Sie flexible Datenstrukturen benötigen, sind Sie möglicherweise an Google Collections interessiert

Andreas Petersson
quelle
1
Bietet Guva eine "UniqueList" an?
Mike Rylander
Nein, aber Sie können ein java.util.LinkedHashSet haben, das ähnliche Eigenschaften hat.
Andreas Petersson
7

Das stimmt, Elemente in Set sind per Definition der Set-Sammlung nicht geordnet. Sie können also nicht über einen Index aufgerufen werden.

Aber warum haben wir keine get (Objekt) -Methode, nicht indem wir den Index als Parameter angeben, sondern ein Objekt, das dem gesuchten Objekt entspricht? Auf diese Weise können wir auf die Daten des Elements innerhalb der Menge zugreifen, indem wir nur die Attribute kennen, die von der Methode equal verwendet werden.

Wände
quelle
7

Wenn Sie in einem Satz viele zufällige Zugriffe nach Index ausführen, können Sie eine Array-Ansicht der Elemente abrufen:

Object[] arrayView = mySet.toArray();
//do whatever you need with arrayView[i]

Es gibt jedoch zwei Hauptnachteile:

  1. Es ist nicht speichereffizient, da ein Array für den gesamten Satz erstellt werden muss.
  2. Wenn der Satz geändert wird, ist die Ansicht veraltet.
fortran
quelle
5

Dies liegt daran, dass Set nur die Eindeutigkeit garantiert, aber nichts über die optimalen Zugriffs- oder Verwendungsmuster aussagt. Das heißt, ein Set kann eine Liste oder eine Karte sein, von denen jede sehr unterschiedliche Abrufeigenschaften aufweist.

jsight
quelle
5

Der einzige Grund, warum ich mir vorstellen kann, einen numerischen Index in einer Menge zu verwenden, ist die Iteration. Verwenden Sie dazu

for(A a : set) { 
   visit(a); 
}
Hugo
quelle
Nicht wahr, was ist mit dem Zugriff auf ein zufälliges Element?
Jeremy Salwen
Ha, ha. Guter Punkt :) Aber das wäre sehr anfällig für Missbrauch, da bin ich mir sicher.
Hugo
3

Ich bin auf Situationen gestoßen, in denen ich tatsächlich ein sortiertes Set mit Zugriff über den Index haben wollte (ich stimme anderen Postern zu, dass der Zugriff auf ein unsortiertes Set mit einem Index keinen Sinn macht). Ein Beispiel wäre ein Baum, in dem ich wollte, dass die Kinder sortiert werden und doppelte Kinder nicht erlaubt sind.

Ich brauchte den Zugriff über den Index, um sie anzuzeigen, und die festgelegten Attribute waren praktisch, um Duplikate effizient zu entfernen.

Da ich in java.util oder in Google-Sammlungen keine geeignete Sammlung gefunden habe, war es für mich unkompliziert, sie selbst zu implementieren. Die Grundidee besteht darin, ein SortedSet zu verpacken und eine Liste zu erstellen, wenn der Zugriff über den Index erforderlich ist (und die Liste zu vergessen, wenn das SortedSet geändert wird). Dies funktioniert natürlich nur dann effizient, wenn das umschlossene SortedSet geändert wird und der Zugriff auf die Liste während der Lebensdauer der Sammlung getrennt wird. Ansonsten verhält es sich wie eine Liste, die oft sortiert wird, dh zu langsam.

Bei einer großen Anzahl von Kindern hat sich die Leistung gegenüber einer Liste, die ich über Collections.sort sortiert habe, erheblich verbessert.

Buchweizen
quelle
2

Bitte beachten Sie, dass über den Index nur auf 2 grundlegende Datenstrukturen zugegriffen werden kann.

  • Auf die Array- Datenstruktur kann über einen Index mit O(1)zeitlicher Komplexität zugegriffen werden , um eine get(int index)Operation zu erreichen .
  • Auf die LinkedList- Datenstruktur kann auch über den Index zugegriffen werden, jedoch mit O(n)zeitlicher Komplexität, um den get(int index)Betrieb zu erreichen .

Wird in Java ArrayListmithilfe der Array- Datenstruktur implementiert .

Während Set Strukturdaten in der Regel über implementiert werden können HashTable / HashMap oder BalancedTree Datenstruktur für die schnelle Erkennung , ob ein Element nicht vorhandenes Element vorhanden ist, und fügen Sie , in der Regel ein gut umgesetzt Set erreichen kann O(1)Zeitkomplexität containsBetrieb. In Java HashSetist dies die am häufigsten verwendete Implementierung von Set . Sie wird durch Aufrufen der HashMapAPI HashMapimplementiert und mithilfe einer separaten Verkettung mit verknüpften Listen (eine Kombination aus Array und LinkedList ) implementiert .

Da Set über unterschiedliche Datenstrukturen implementiert werden kann, gibt es dafür keine get(int index)Methode.

coderz
quelle
Fingerbäume (siehe Haskell- Data.Sequence.lookupFunktion) ermöglichen auch den Zugriff über den Index ( genauer gesagt O(1)in der Nähe der Enden O(log n)in der Nähe der Mitte O(min(log(k), log(n-k)))), auch Binärbäume (siehe Haskell- Data.Set.lookupIndexFunktion). Ihre anfängliche Behauptung, dass "Bitte beachten Sie, dass nur auf 2 grundlegende Datenstrukturen über den Index zugegriffen werden kann", ist daher nicht korrekt.
Semikolon
1

Der Grund, warum die Set- Schnittstelle keinen Aufruf vom Typ get index oder etwas noch grundlegenderes wie first () oder last () hat, liegt darin, dass es sich um eine mehrdeutige Operation handelt und daher eine potenziell gefährliche Operation. Wenn eine Methode einen Satz zurückgibt und Sie beispielsweise die Methode first () aufrufen, was ist das erwartete Ergebnis, da ein generischer Satz keine Garantie für die Bestellung übernimmt? Das resultierende Objekt kann sehr gut zwischen den einzelnen Aufrufen der Methode variieren, oder es kann nicht dazu führen, dass Sie in ein falsches Sicherheitsgefühl versetzt werden, bis die von Ihnen verwendete Bibliothek die darunter liegende Implementierung ändert und Sie nun feststellen, dass Ihr gesamter Code für bricht kein bestimmter Grund.

Die hier aufgeführten Vorschläge zu Problemumgehungen sind gut. Wenn Sie einen indizierten Zugriff benötigen, verwenden Sie eine Liste. Seien Sie vorsichtig bei der Verwendung von Iteratoren oder toArray mit einem generischen Satz, da a) keine Garantie für die Bestellung besteht und b) keine Garantie dafür besteht, dass sich die Reihenfolge bei nachfolgenden Aufrufen oder bei anderen zugrunde liegenden Implementierungen nicht ändert. Wenn Sie etwas dazwischen benötigen, ist ein SortedSet oder ein LinkedHashSet das, was Sie wollen.

// Ich wünschte, die Set-Schnittstelle hätte ein get-random-Element.

Dan
quelle
1

java.util.Setist eine Sammlung von nicht bestellten Artikeln. Es macht keinen Sinn, wenn das Set einen get (int-Index) hat, da Set keinen Index hat und Sie auch nur den Wert erraten können.

Wenn Sie dies wirklich wollen, codieren Sie eine Methode, um ein zufälliges Element aus Set zu erhalten.

Suchergebnisse Web-Ergebnisse Pi
quelle
0

Du kannst tun new ArrayList<T>(set).get(index)

Janus Troelsen
quelle
Dies gibt eine Liste von Mengen zurück und get (index) gibt eine Menge zurück. Ich habe eher verwendet: new ArrayList<T>(t).get(0) Ich denke, es gibt einen berechtigten Widerspruch gegen die Idee, ein bestimmtes Element aus einer Menge durch einen Index zu erhalten. Es wäre jedoch schön, wenn Set eine nur () -Mitgliedsfunktion hätte, die für Sets der Größe 1 einen einfachen Zugriff auf das einzige Element im Set ermöglicht. Dies würde die oben genannten new ArrayListoderfor (Foo foo : foos) { return foo; }
Doug Moscrop
0

Wenn Ihnen das zu sortierende Set nichts ausmacht, können Sie sich das Projekt mit der indizierten Baumkarte ansehen .

Das erweiterte TreeSet / TreeMap bietet Zugriff auf Elemente durch Index oder Abrufen des Index eines Elements. Die Implementierung basiert auf der Aktualisierung der Knotengewichte im RB-Baum. Also keine Iteration oder Sicherung durch eine Liste hier.

Vitaly Sazanovich
quelle
0

Set ist eine Schnittstelle und einige seiner Implementierungsklassen sind HashSet, TreeSet und LinkedHashSet. Es verwendet HashMap unter der Haube, um Werte zu speichern. Da HashMap die Reihenfolge nicht beibehält, ist es nicht möglich, den Wert per Index abzurufen.

Sie müssen jetzt darüber nachdenken, wie Set HashMap verwendet, da HashMap ein Schlüssel-Wert-Paar speichert, das Set jedoch nicht. gültige Frage. Wenn Sie ein Element intern in Set hinzufügen, wird eine HashMap verwaltet, in der der Schlüssel das Element ist, das Sie in Set eingeben möchten, und der Wert die Dummy-Konstante ist. Unten finden Sie eine interne Implementierung der Add-Funktion. Daher haben alle Schlüssel in der HashMap den gleichen konstanten Wert.

// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}
Magnonyme
quelle
Alle SetImplementierungen werden HashMapunter der Haube verwendet, um Werte zu speichern. Können Sie diesen Anspruch begründen TreeSet?
Graubart
1
the keys in the HashMap will have the same constant value Die Schlüssel im HashMapTestament werden ein und derselben unveränderlichenObject
Graubart
-3

Um ein Element in einem Set zu erhalten, verwende ich Folgendes:

public T getElement(Set<T> set, T element) {
T result = null;
if (set instanceof TreeSet<?>) {
    T floor = ((TreeSet<T>) set).floor(element);
    if (floor != null && floor.equals(element))
    result = floor;
} else {
    boolean found = false;
    for (Iterator<T> it = set.iterator(); !found && it.hasNext();) {
    if (true) {
        T current = it.next();
        if (current.equals(element)) {
        result = current;
        found = true;
        }
    }
    }
}
return result;
}
Lala
quelle
Die Funktion entspricht nicht der Frage. Wir brauchen den Index, nicht den Wert. Was macht deine Funktion überhaupt? Es sieht so aus, als würde das Element nur zurückgegeben, wenn es einem darin enthaltenen Element entspricht. Was macht das, was enthält () nicht?
Janus Troelsen
Wo ist das Tdefiniert? Warum if (true)?
Quantum