J'aime la façon dont Java a une carte où vous pouvez définir les types de chaque entrée dans la carte, par exemple <String, Integer>
.
Ce que je recherche, c'est un type de collection où chaque élément de la collection est une paire de valeurs. Chaque valeur de la paire peut avoir son propre type (comme l'exemple String et Integer ci-dessus), qui est défini au moment de la déclaration.
La collection conservera son ordre donné et ne traitera pas l'une des valeurs comme une clé unique (comme dans une carte).
Essentiellement, je veux pouvoir définir un ARRAY de type <String,Integer>
ou tout autre 2 types.
Je me rends compte que je peux faire une classe avec rien que les 2 variables en elle, mais cela semble trop verbeux.
Je me rends également compte que je pourrais utiliser un tableau 2D, mais en raison des différents types que je dois utiliser, je devrais en faire des tableaux OBJECT, puis je devrais lancer tout le temps.
J'ai seulement besoin de stocker des paires dans la collection, donc je n'ai besoin que de deux valeurs par entrée. Est-ce que quelque chose comme ça existe sans suivre l'itinéraire de classe? Merci!
Pair
, et les gens de Google sont allés jusqu'à créer une bien meilleure alternative - Auto / Value . Il vous permet de créer facilement des classes de types de valeurs bien typées , avec la sémantique equals / hashCode appropriée. Vous n'aurez plus jamais besoin d'unPair
type!Réponses:
La classe Pair est l'un de ces exemples génériques "gimme" qui est assez facile à écrire par vous-même. Par exemple, du haut de ma tête:
Et oui, cela existe à plusieurs endroits sur le Net, avec différents degrés d'exhaustivité et de fonctionnalité. (Mon exemple ci-dessus est destiné à être immuable.)
la source
long l = left.hashCode() * 2654435761L;
return (int)l + (int)(l >>> 32) + right.hashCode();
AbstractMap.SimpleEntry
Facile, vous recherchez ceci:
Comment pouvez-vous le remplir?
Cela simplifie:
Et, à l'aide d'une
createEntry
méthode, peut encore réduire la verbosité à:Étant donné qu'il
ArrayList
n'est pas définitif, il peut être sous-classé pour exposer uneof
méthode (et lacreateEntry
méthode susmentionnée ), ce qui entraîne la syntaxe laconique:la source
SimpleEntry
unesetValue
méthode omettant la classe frère pour être immuable. D'où le nomSimpleImmutableEntry
.Entry
est censé être une paire valeur / clé, et c'est très bien pour cela. Mais il a des faiblesses comme un vrai tuple. Par exemple, l'hashcode
implémentation enSimpleEntry
xors juste les codes des éléments, donc<a,b>
hache à la même valeur que<b,a>
. Les implémentations de tuple trient souvent lexicographiquement, maisSimpleEntry
ne l'implémentent pasComparable
. Alors faites attention là-bas ...Java 9+
En Java 9, vous pouvez simplement écrire:
Map.entry(key, value)
pour créer une paire immuable.Remarque: cette méthode ne permet pas que les clés ou les valeurs soient nulles. Si vous souhaitez autoriser les valeurs NULL, par exemple, vous voulez changer cela:
Map.entry(key, Optional.ofNullable(value))
.Java 8+
Dans Java 8, vous pouvez utiliser le plus polyvalent
javafx.util.Pair
pour créer une paire immuable et sérialisable. Cette classe ne permet touches nulles et les valeurs NULL. (En Java 9, cette classe est incluse dans lejavafx.base
module). EDIT: Depuis Java 11, JavaFX a été découplé du JDK, vous auriez donc besoin de l'artefact maven supplémentaire org.openjfx: javafx-base.Java 6+
Dans Java 6 et versions ultérieures, vous pouvez utiliser le plus détaillé
AbstractMap.SimpleImmutableEntry
pour une paire immuable ouAbstractMap.SimpleEntry
pour une paire dont la valeur peut être modifiée. Ces classes autorisent également les clés et les valeurs nulles et sont sérialisables.Android
Si vous écrivez pour Android, utilisez simplement
Pair.create(key, value)
pour créer une paire immuable.Apache Commons
Apache Commons Lang
fournit l'utilePair.of(key, value)
pour créer une paire immuable, comparable et sérialisable.Collections Eclipse
Si vous utilisez des paires contenant des primitives, Eclipse Collections fournit des classes de paires de primitives très efficaces qui éviteront toutes les boîtes automatiques et décompresseurs automatiques inefficaces.
Par exemple, vous pouvez utiliser
PrimitiveTuples.pair(int, int)
pour créer unIntIntPair
ouPrimitiveTuples.pair(float, long)
pour créer unFloatLongPair
.Projet Lombok
En utilisant Project Lombok , vous pouvez créer une classe de paires immuable simplement en écrivant:
Lombok remplira le constructeur, apporteurs,
equals()
,hashCode()
et lestoString()
méthodes pour vous automatiquement dans le bytecode généré. Si vous voulez une méthode usine statique au lieu d'un constructeur, par exemple, unPair.of(k, v)
, modifiez simplement l'annotation à:@Value(staticConstructor = "of")
.Autrement
Si aucune des solutions ci-dessus ne fait flotter votre bateau, vous pouvez simplement copier et coller le code suivant (qui, contrairement à la classe répertoriée dans la réponse acceptée, protège contre NullPointerExceptions):
la source
Pair
interface pour les objets, qui peut être instanciée en appelantTuples.pair(object1, object2)
. eclipse.org/collections/javadoc/9.2.0/org/eclipse/collections/…List<Pair<Integer, String> listOfTuple
. Comment dois-je l'utiliserlistOfTuple.add()
? Si je fais -listOfTuple.add(Pair<someInteger, someString>);
, cela ne fonctionnera pas. Merci d'avance.Map.Entry
Ces classes intégrées sont également une option. Les deux implémentent l'
Map.Entry
interface.AbstractMap.SimpleEntry
AbstractMap.SimpleImmutableEntry
la source
Apache common lang3 a la classe Pair et quelques autres bibliothèques mentionnées dans ce fil Quel est l'équivalent de la paire C ++ <L, R> en Java?
Exemple correspondant à l'exigence de votre question d'origine:
la source
Pour tous ceux qui développent pour Android, vous pouvez utiliser android.util.Pair . :)
la source
Qu'en est-il de la
Pair
classe "Apache Commons Lang 3" et des sous-classes relatives?ImmutablePair
est une sous-classe spécifique qui ne permet pas de modifier les valeurs de la paire, mais il existe d'autres implémentations avec une sémantique différente. Ce sont les coordonnées Maven, si vous en avez besoin.la source
Vous pouvez écrire une classe Pair <A, B> générique et l'utiliser dans un tableau ou une liste. Oui, vous devez écrire une classe, mais vous pouvez réutiliser la même classe pour tous les types, vous n'avez donc à le faire qu'une seule fois.
la source
En développant les autres réponses, une paire générique immuable devrait avoir une méthode statique pour éviter d'encombrer votre code avec l'appel au constructeur:
si vous nommez la méthode statique "of" ou "pairOf", le code devient fluide car vous pouvez écrire soit:
c'est vraiment dommage que les bibliothèques java de base soient si rares sur de telles choses que vous devez utiliser commons-lang ou d'autres tierces parties pour faire de telles choses de base. encore une autre raison de passer à scala ...
la source
J'allais vous demander si vous ne voudriez pas simplement utiliser un
List<Pair<T, U>>
? mais alors, bien sûr, le JDK n'a pas de classe Pair <>. Mais un rapide Google en a trouvé un sur Wikipédia et sur forums.sun.com . À votre santéla source
La solution préférée telle que vous l'avez décrite est une liste de paires (c'est-à-dire une liste).
Pour ce faire, vous devez créer une classe Pair à utiliser dans votre collection. Il s'agit d'une classe utilitaire utile à ajouter à votre base de code.
AbstractMap.SimpleEntry est la classe la plus proche dans le JDK Sun fournissant des fonctionnalités similaires à une classe Pair typique. Vous pouvez utiliser cette classe plutôt que de créer votre propre classe Pair, bien que vous deviez vivre avec des restrictions maladroites et je pense que la plupart des gens ne verraient pas cela comme le rôle prévu de SimpleEntry. Par exemple, SimpleEntry n'a pas de méthode "setKey ()" et aucun constructeur par défaut, vous pouvez donc la trouver trop limitative.
Gardez à l'esprit que les collections sont conçues pour contenir des éléments d'un seul type. Les interfaces utilitaires associées telles que Map ne sont pas réellement des collections (c'est-à-dire que Map n'implémente pas l'interface Collection). Une paire n'implémenterait pas non plus l'interface de collection, mais est évidemment une classe utile pour construire des structures de données plus grandes.
la source
Ceci est basé sur le code de JavaHelp4u.
Moins verbeux et montre comment faire en une seule ligne et comment boucler les choses.
la source
Apache Crunch a également une
Pair
classe: http://crunch.apache.org/apidocs/0.5.0/org/apache/crunch/Pair.htmlla source
il suffit de créer une classe comme
puis créez la liste de ces objets de tuples
afin que vous puissiez également implémenter d'autres nouvelles structures de données de la même manière.
la source
Je veux dire, même s'il n'y a pas de
Pair
classe en Java, il y a quelque chose de très similaire:Map.Entry
Documentation Map.Entry
C'est (simplifiant un peu) quoi
HashMap
, ou en fait n'importe quelMap
magasin.Vous pouvez créer une instance pour y
Map
stocker vos valeurs et obtenir le jeu d'entrées. Vous vous retrouverez avec unSet<Map.Entry<K,V>>
qui est effectivement ce que vous voulez.Donc:
la source
Spring a un
Pair<S,T>
type dans le package Data Utilsorg.springframework.data.util
la source
Qu'en est-il de com.sun.tools.javac.util.Pair?
la source
La première chose qui me vient à l'esprit lorsque l'on parle de paires clé / valeur est la classe Propriétés où vous pouvez enregistrer et charger des éléments dans un flux / fichier.
la source
Dans le projet Reactor (io.projectreactor: reactor-core), il existe un support avancé pour n-Tuples:
Là, vous pouvez obtenir
t.getT1(), t.getT2(), ...
Surtout avec Stream ou Flux, vous pouvez même mapper les éléments de tuple:la source