Mir gefällt, wie Java eine Karte hat, in der Sie beispielsweise die Typen der einzelnen Einträge in der Karte definieren können <String, Integer>
.
Was ich suche, ist eine Art von Sammlung, bei der jedes Element in der Sammlung ein Wertepaar ist. Jeder Wert im Paar kann einen eigenen Typ haben (wie im obigen Beispiel für String und Integer), der zur Deklarationszeit definiert wird.
Die Sammlung behält ihre angegebene Reihenfolge bei und behandelt einen der Werte nicht als eindeutigen Schlüssel (wie in einer Karte).
Im Wesentlichen möchte ich in der Lage sein, einen ARRAY vom Typ <String,Integer>
oder andere 2 Typen zu definieren .
Mir ist klar, dass ich eine Klasse nur mit den 2 Variablen erstellen kann, aber das scheint zu ausführlich.
Mir ist auch klar, dass ich ein 2D-Array verwenden könnte, aber aufgrund der verschiedenen Typen, die ich verwenden muss, müsste ich sie zu OBJECT-Arrays machen und dann die ganze Zeit umwandeln.
Ich muss nur Paare in der Sammlung speichern, daher benötige ich nur zwei Werte pro Eintrag. Gibt es so etwas, ohne den Klassenweg zu gehen? Vielen Dank!
Pair
und die Leute bei Google sind so weit gegangen, eine viel bessere Alternative zu schaffen - Auto / Wert . Sie können auf einfache Weise gut typisierte Werttypklassen mit der richtigen Semantik für equals / hashCode erstellen . Sie werden nie wieder einenPair
Typ brauchen !Antworten:
Die Pair-Klasse ist eines dieser "Gimme" -Generikbeispiele, die einfach genug sind, um sie selbst zu schreiben. Zum Beispiel von oben:
Und ja, dies gibt es an mehreren Stellen im Internet mit unterschiedlichem Grad an Vollständigkeit und Funktionalität. (Mein Beispiel oben soll unveränderlich sein.)
quelle
long l = left.hashCode() * 2654435761L;
return (int)l + (int)(l >>> 32) + right.hashCode();
AbstractMap.SimpleEntry
Einfach suchen Sie dies:
Wie kannst du es füllen?
Dies vereinfacht zu:
Und mit Hilfe einer
createEntry
Methode kann die Ausführlichkeit weiter reduziert werden auf:Da dies
ArrayList
nicht endgültig ist, kann es in Unterklassen unterteilt werden, um eineof
Methode (und die oben genanntecreateEntry
Methode) verfügbar zu machen, was zu dem syntaktisch knappen Ergebnis führt:quelle
SimpleEntry
eine Geschwisterklasse diesetValue
Methode weglässt , um unveränderlich zu sein. Also der NameSimpleImmutableEntry
.Entry
soll ein Schlüssel-Wert-Paar sein, und dafür ist es in Ordnung. Aber es hat Schwächen als wahres Tupel. Zum Beispiel xors diehashcode
Implementierung inSimpleEntry
nur xors die Codes der Elemente, so<a,b>
hascht auf den gleichen Wert wie<b,a>
. Tupel-Implementierungen werden häufig lexikografisch sortiert, jedochSimpleEntry
nicht implementiertComparable
. Also sei vorsichtig da draußen ...Java 9+
In Java 9 können Sie einfach schreiben:
Map.entry(key, value)
um ein unveränderliches Paar zu erstellen.Hinweis: Bei dieser Methode dürfen Schlüssel oder Werte nicht null sein. Wenn Sie beispielsweise Nullwerte zulassen möchten, möchten Sie dies ändern in :
Map.entry(key, Optional.ofNullable(value))
.Java 8+
In Java 8 können Sie den allgemeineren Zweck verwenden
javafx.util.Pair
, um ein unveränderliches, serialisierbares Paar zu erstellen. Diese Klasse ist null Schlüssel und Nullwerte zulassen. (In Java 9 ist diese Klasse imjavafx.base
Modul enthalten).BEARBEITEN: Ab Java 11 wurde JavaFX vom JDK entkoppelt, sodass Sie das zusätzliche Maven-Artefakt org.openjfx: javafx-base benötigen.Java 6+
In Java 6 und höher können Sie die ausführlichere Version
AbstractMap.SimpleImmutableEntry
für ein unveränderliches Paar oderAbstractMap.SimpleEntry
für ein Paar verwenden, dessen Wert geändert werden kann. Diese Klassen erlauben auch Nullschlüssel und Nullwerte und sind serialisierbar.Android
Wenn Sie für Android schreiben
Pair.create(key, value)
, erstellen Sie einfach ein unveränderliches Paar.Apache Commons
Apache Commons Lang
bietet die MöglichkeitPair.of(key, value)
, ein unveränderliches, vergleichbares, serialisierbares Paar zu erstellen.Eclipse-Sammlungen
Wenn Sie Paare verwenden, die Grundelemente enthalten, Eclipse-Sammlungen bietet einige sehr effiziente Grundelementpaarklassen, die das ineffiziente automatische Boxen und automatische Entpacken vermeiden.
Sie können beispielsweise
PrimitiveTuples.pair(int, int)
einIntIntPair
oder einPrimitiveTuples.pair(float, long)
erstellenFloatLongPair
.Projekt Lombok
Mit Project Lombok können Sie eine unveränderliche Paarklasse erstellen, indem Sie einfach Folgendes schreiben:
Lombok wird in den Konstruktor, Getter, füllen
equals()
,hashCode()
undtoString()
Methoden für Sie automatisch in der erzeugten Bytecode. Wenn Sie eine statische Factory-Methode anstelle eines Konstruktors möchten, z. B. aPair.of(k, v)
, ändern Sie einfach die Anmerkung in :@Value(staticConstructor = "of")
.Andernfalls
Wenn keine der oben genannten Lösungen Ihr Boot schwimmt, können Sie einfach den folgenden Code kopieren und einfügen (der im Gegensatz zu der in der akzeptierten Antwort aufgeführten Klasse vor NullPointerExceptions schützt):
quelle
Pair
Schnittstelle für Objekte, die durch Aufrufen instanziiert werden kannTuples.pair(object1, object2)
. eclipse.org/collections/javadoc/9.2.0/org/eclipse/collections/…List<Pair<Integer, String> listOfTuple
. Wie benutze ichlistOfTuple.add()
? Wenn ich das machelistOfTuple.add(Pair<someInteger, someString>);
, wird das nicht funktionieren. Danke im Voraus.Map.Entry
Diese integrierten Klassen sind ebenfalls eine Option. Beide implementieren die
Map.Entry
Schnittstelle.AbstractMap.SimpleEntry
AbstractMap.SimpleImmutableEntry
quelle
Apache common lang3 hat die Pair-Klasse und einige andere in diesem Thread erwähnte Bibliotheken. Was entspricht dem C ++ - Pair <L, R> in Java?
Beispiel, das der Anforderung Ihrer ursprünglichen Frage entspricht:
quelle
Für alle, die für Android entwickeln, können Sie android.util.Pair verwenden . :) :)
quelle
Was ist mit der
Pair
Klasse "Apache Commons Lang 3" und den relativen Unterklassen?ImmutablePair
ist eine bestimmte Unterklasse, mit der die Werte im Paar nicht geändert werden können. Es gibt jedoch auch andere Implementierungen mit unterschiedlicher Semantik. Dies sind die Maven-Koordinaten, falls Sie sie benötigen.quelle
Sie können eine generische Pair <A, B> -Klasse schreiben und diese in einem Array oder einer Liste verwenden. Ja, Sie müssen eine Klasse schreiben, aber Sie können dieselbe Klasse für alle Typen wiederverwenden, sodass Sie sie nur einmal ausführen müssen.
quelle
Wenn Sie die anderen Antworten erweitern, sollte ein generisches unveränderliches Paar über eine statische Methode verfügen, um zu vermeiden, dass Ihr Code beim Aufruf des Konstruktors überladen wird:
Wenn Sie die statische Methode "of" oder "pairOf" nennen, wird der Code fließend, da Sie entweder schreiben können:
Es ist eine echte Schande, dass die Java-Kernbibliotheken so spärlich mit solchen Dingen umgehen, dass Sie commons-lang oder andere Drittanbieter verwenden müssen, um solche grundlegenden Dinge zu erledigen. Ein weiterer Grund für ein Upgrade auf Scala ...
quelle
Ich wollte fragen, ob Sie nicht einfach eine verwenden möchten
List<Pair<T, U>>
? Aber dann hat das JDK natürlich keine Pair <> -Klasse. Aber ein schneller Google hat einen sowohl auf Wikipedia als auch auf forums.sun.com gefunden . Prostquelle
Die bevorzugte Lösung, wie Sie sie beschrieben haben, ist eine Liste von Paaren (dh Liste).
Um dies zu erreichen, erstellen Sie eine Pair-Klasse zur Verwendung in Ihrer Sammlung. Dies ist eine nützliche Dienstprogrammklasse, die Sie Ihrer Codebasis hinzufügen können.
Die nächstgelegene Klasse im Sun JDK, die ähnliche Funktionen wie eine typische Pair-Klasse bietet, ist AbstractMap.SimpleEntry. Sie könnten diese Klasse verwenden, anstatt Ihre eigene Pair-Klasse zu erstellen, obwohl Sie mit einigen umständlichen Einschränkungen leben müssten, und ich denke, die meisten Leute würden dies als nicht wirklich die beabsichtigte Rolle von SimpleEntry missbilligen. Zum Beispiel hat SimpleEntry keine "setKey ()" - Methode und keinen Standardkonstruktor, daher ist dies möglicherweise zu einschränkend.
Beachten Sie, dass Sammlungen Elemente eines einzelnen Typs enthalten. Verwandte Dienstprogrammschnittstellen wie Map sind eigentlich keine Sammlungen (dh Map implementiert die Collection-Schnittstelle nicht). Ein Paar würde auch die Collection-Schnittstelle nicht implementieren, ist aber offensichtlich eine nützliche Klasse beim Aufbau größerer Datenstrukturen.
quelle
Dies basiert auf dem Code von JavaHelp4u.
Weniger ausführlich und zeigt, wie man in einer Zeile vorgeht und wie man Dinge durchläuft.
quelle
Apache Crunch hat auch eine
Pair
Klasse: http://crunch.apache.org/apidocs/0.5.0/org/apache/crunch/Pair.htmlquelle
Erstelle einfach eine Klasse wie
Erstellen Sie dann eine Liste dieser Tupelobjekte
Auf diese Weise können Sie auch andere neue Datenstrukturen implementieren.
quelle
Ich meine, obwohl es
Pair
in Java keine Klasse gibt, gibt es etwas ziemlich Ähnliches:Map.Entry
Map.Entry-Dokumentation
Dies ist (einiges vereinfacht) was
HashMap
oder tatsächlich irgendeinMap
Geschäfte.Sie können eine Instanz zum
Map
Speichern Ihrer Werte darin erstellen und den Eintragssatz abrufen. Sie werden mit einem endenSet<Map.Entry<K,V>>
das effektiv das ist, was Sie wollen.Damit:
quelle
Spring hat einen
Pair<S,T>
Typ im Data Utils-Paketorg.springframework.data.util
quelle
Was ist mit com.sun.tools.javac.util.Pair?
quelle
Wenn ich über Schlüssel / Wert-Paare spreche, denke ich zuerst an die Eigenschaftenklasse, in der Sie Elemente speichern und in einen Stream / eine Datei laden können.
quelle
Im Projekt Reaktor (io.projectreactor: Reaktorkern) gibt es erweiterte Unterstützung für n-Tupel:
Dort können Sie vor
t.getT1(), t.getT2(), ...
allem mit Stream oder Flux sogar die Tupelelemente abbilden:quelle