web-dev-qa-db-fra.com

Création d'une liste de paires en java

Quelle classe fonctionnerait le mieux pour une liste de paires non ordonnée? Je vais prendre un tas de paires (float, short) et devra pouvoir effectuer des calculs simples (comme multiplier la paire pour obtenir un seul float, etc.). La liste ne prend qu'un argument, et HashMap n'autorisera pas les doublons (pour autant que je sache). Des pensées?

24
V1rtua1An0ma1y

Vous pouvez utiliser la classe Entry<U,V> utilisée par HashMap mais vous serez bloqué par sa sémantique de getKey et getValue:

List<Entry<Float,Short>> pairList = //...

Ma préférence serait de créer votre propre classe Pair simple:

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, créez une List en utilisant cette nouvelle classe, par exemple:

List<Pair<Float,Short>> pairList = new ArrayList<Pair<Float,Short>>();

Vous pouvez également toujours créer une Lists de Lists, mais il devient difficile d'appliquer le dimensionnement (vous n'avez que des paires) et vous seriez obligé, comme pour les tableaux, d'avoir un typage cohérent.

40
Mark Elliot

Utilisez une liste d'instances de classe personnalisées. La classe personnalisée est une sorte de paire, de coordonnées ou autre. Alors juste

List<Coordinate> = new YourFavoriteListImplHere<Coordinate>()

Cette approche présente l’avantage de satisfaire à cette exigence "effectuer des calculs simples (comme multiplier la paire pour renvoyer un seul flottant, etc.)", car votre classe personnalisée peut avoir des méthodes pour tout ce que vous devez faire ...

11
hvgotcodes

je corrige juste quelques petites erreurs dans le code de Mark Elliot:

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; }
}
4
andresp

On dirait que vous devez créer votre propre classe de couples (voir discussion ici ). Ensuite, faites une liste de la classe de paires que vous avez créée

1
Shezan Baig

Si vous voulez des multiplicités, vous pouvez le mettre sur une carte qui mappe la paire à monter ..____. De cette façon, il n'y aura qu'une paire de valeurs données, mais cela peut représenter plusieurs occurrences.

Ensuite, si vous avez beaucoup de valeurs de répétition et que vous souhaitez effectuer une opération sur toutes les valeurs, vous pouvez enregistrer beaucoup de calculs.

0
Alpedar

Semblable à ce que Mark E a proposé, vous devez créer le vôtre. Juste pour vous aider, il existe un article soigné http://gleichmann.wordpress.com/2008/01/15/building-your-own-literals-in-Java-tuples-and-maps/ ce qui vous donne une manière très soignée de créer des n-uplets et des cartes que vous voudrez peut-être envisager.

0
gbvb