2011-01-24 14 views
22

Quale classe avrebbe funzionato meglio per una lista non ordinata di coppie? Prenderò un paio di coppie (float, short) e dovrò essere in grado di eseguire semplici calcoli matematici (come moltiplicare la coppia per restituire un singolo float, ecc.). List accetta solo un argomento e HashMap non consente duplicati (per quanto ne so). qualche idea?Creazione di un elenco di coppie in java

risposta

37

È possibile utilizzare la classe Entry<U,V> che HashMap usi, ma ti verrà bloccato con la sua semantica di getKey e getValue:

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

La mia preferenza sarebbe quella di creare il proprio semplice 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; } 
} 

Quindi ovviamente creare un List utilizzando questa nuova classe, ad esempio:

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

È inoltre possibile sempre fare un List s di List s, ma diventa difficile far rispettare dimensionamento (che si hanno solo le coppie) e si sarebbero tenuti, come con gli array, di avere a digitare coerente.

+0

Ma mi sarebbe sicuramente solo fare la classe segnaposto e quindi aggiungere le istanze di esso ad un list-- chiamare le cose col loro nome ... –

+0

Diamo dire che stavo per farlo senza una nuova classe. Sto pensando di eseguire solo due elenchi del tipo appropriato. Perché si lamenta quando faccio: elenco privato floatList = new List (); ma non quando esco dall'operatore di assegnazione e ho solo Elenco privato floatList; ? Ha ancora bisogno di essere istanziato, vero? – V1rtua1An0ma1y

+0

@ V1rtua1An0ma1y: poiché 'List' è un'interfaccia, è necessaria un'implementazione, come, ad esempio,' ArrayList' o 'LinkedList'. –

11

Utilizzare un elenco di istanze di classe personalizzati. La classe personalizzata è una sorta di coppia o coordinata o qualsiasi altra cosa. Poi basta

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

Questo approccio ha il vantaggio che rende soddisfare questo requisito "compiere semplici operazioni matematiche (come moltiplicare la coppia insieme per restituire un unico galleggiante, ecc)" pulito, perché la classe personalizzata può avere metodi per qualunque la matematica che devi fare ...

1

Suona come è necessario creare la propria classe coppia (vedi discussion here). Poi fare una lista di quella classe coppia si è creato

0

Se volete molteplicità, si può mettere in mappa che mappa coppia a ammount. In questo modo ci sarà solo una coppia di valori dati, ma può rappresentare più occorrenze.

Quindi se si hanno molti valori repeatet e desidera eseguire alcune operazioni su tutti i valori, è possibile risparmiare molti calcoli.

4

solo fissare qualche piccolo errore nel codice di 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; } 
} 
Problemi correlati