Création d'une liste de paires en java
quelle classe conviendrait le mieux pour une liste non-ordonnée de paires? Je vais prendre un tas de (float,bref) paires et devra être capable d'effectuer des calculs simples (comme la multiplication de la paire ensemble pour renvoyer un seul flotteur, etc). List ne prend qu'un seul argument, et HashMap n'autorise pas les doublons (pour autant que je sache). Toutes les pensées?
6 réponses
vous pouvez utiliser la classe Entry<U,V>
que HashMap
utilise mais vous serez coincé avec sa sémantique de getKey
et getValue
:
List<Entry<Float,Short>> pairList = //...
Ma préférence serait de créer votre propre simple Pair
classe:
public class Pair<L,R> {
private L l;
private R r;
public Pair(L l, R r){
this.l = l;
this.r = r;
}
public L getL(){ return l; }
public R getR(){ return r; }
public void setL(L l){ this.l = l; }
public void setR(R r){ this.r = r; }
}
ensuite, bien sûr, faire un List
en utilisant cette nouvelle classe, par exemple:
List<Pair<Float,Short>> pairList = new ArrayList<Pair<Float,Short>>();
vous pouvez aussi toujours faire un List
s de List
s, mais il devient difficile d'appliquer la taille (que vous n'avez que des paires) et vous seriez requis, comme avec les tableaux, d'avoir un typage cohérent.
utilisez une liste d'instances de classe personnalisées. La classe personnalisée est une sorte de paire ou de coordonnée ou n'importe quoi d'autre. Alors juste
List<Coordinate> = new YourFavoriteListImplHere<Coordinate>()
cette approche a l'avantage de satisfaire à cette exigence" effectuer des mathématiques simples (comme la multiplication de la paire ensemble pour retourner un flotteur simple, etc) " propre, parce que votre classe personnalisée peut avoir des méthodes pour toutes les mathématiques que vous avez besoin de faire...
seulement pour réparer quelques petites erreurs dans Mark Elliot code:
public class Pair<L,R> {
private L l;
private R r;
public Pair(L l, R r){
this.l = l;
this.r = r;
}
public L getL(){ return l; }
public R getR(){ return r; }
public void setL(L l){ this.l = l; }
public void setR(R r){ this.r = r; }
}
sonne comme vous devez créer votre propre classe de paire (voir discussion ici ). Ensuite, faites une liste de cette classe de paire que vous avez créée
similaire à ce que Mark E a proposé, vous devez venir avec votre propre. Juste pour vous aider un peu, il y a un article soigné http://gleichmann.wordpress.com/2008/01/15/building-your-own-literals-in-java-tuples-and-maps / qui vous donne une façon vraiment soignée de créer des tuples et des cartes qui pourraient être quelque chose que vous pourriez vouloir considérer.
si vous voulez des multiplicités, vous pouvez le mettre dans la carte qui correspond à ammount. De cette façon, il n'y aura qu'une seule paire de valeurs données, mais il peut représenter plusieurs événements.
Alors si vous avez beaucoup de repeatet valeurs et souhaitez effectuer une opération sur toutes les valeurs, vous pouvez économiser beaucoup de calculs.