2010-05-12 19 views
8

È possibile avere un array che contiene due diversi tipi di dati? Voglio avere una matrice che contenga un doppio e anche una stringa. Ho provato:Matrici di tipi diversi

ArrayList<double><String> array; 

Ma questo non ha funzionato.

Ci scusiamo per la domanda sciocca, ma è passato un po 'di tempo da quando ho usato qualcosa di simile .. Puoi rinfrescarmi la memoria su come dichiarare e popolare un tale array?

E quindi per fare un ulteriore passo, vorrei ordinare l'array per il doppio se possibile?

Grazie!

+1

No, questo non è possibile. Cosa stai cercando di fare esattamente? Forse possiamo aiutarti a trovare una soluzione alternativa. –

risposta

14

In primo luogo, vale la pena di essere chiari circa la differenza tra un array e un ArrayList - non sono la stessa cosa a tutti.

Tuttavia, in entrambi i casi non è possibile fare ciò che si desidera. Il più vicino che puoi probabilmente è dichiarare il tuo tipo. (MODIFICA: il mio codice originale aveva un doppio o una stringa ... Ora lo ho modificato per essere un doppio e una stringa. Fatemi sapere se questo cambiamento non è quello che avevate in mente.)

public final class DoubleAndString 
{ 
    private final String stringValue; 
    private final double doubleValue; 

    public DoubleAndString(String stringValue, double doubleValue) 
    { 
     this.stringValue = stringValue; 
     this.doubleValue = doubleValue; 
    } 

    public String getString() 
    { 
     return stringValue; 
    } 

    public String getDouble() 
    { 
     return doubleValue; 
    } 
} 

quindi creare ArrayList<DoubleAndString> o un DoubleAndString[].

Ora, questo sembra un po 'vaniglia al momento - presumibilmente i valori di doppia e stringa hanno in realtà un significato più grande - un nome e un punteggio, per esempio. Se è così, incapsula quello in un tipo che descrive l'accoppiamento in modo più appropriato.

quanto per l'ordinazione - si potrebbe fare DoubleAndString attuare Comparable<DoubleAndString> - ma a meno che questo è l'solo ordinamento naturale che ha un senso, mi piacerebbe scrivere un Comparator<DoubleAndString>:

public class DoubleComparator implements Comparator<DoubleAndString> 
{ 
    public int compare(DoubleAndString ds1, DoubleAndString ds2) 
    { 
     return Double.compare(ds1.getDouble(), ds2.getDouble()); 
    } 
} 

quindi è possibile utilizzare Collections.sort per ordina un ArrayList<DoubleAndString> o Arrays.sort per ordinare un array.

+0

+1, battuto. Questo sarebbe stato il mio suggerimento e il tipo di dati personalizzati. – Robb

2

Sembra che tu voglia una mappa. Dal momento che desideri ordinare la mappa, una TreeMap potrebbe essere ottimale.

Map<Double, String> myMap = new TreeMap<Double, String>(); 

Le mappe sono associative. Ogni doppio ha una stringa associata. Se si desidera più stringhe per doppio, è possibile utilizzare un

Map<Double, ArrayList<String>> 
1

Cosa vuoi fare?

Se non è un mapping di valori chiave, è necessario creare una nuova classe per questo.

2

Bene, se si desidera disporre di un array con un numero arbitrario di elementi, è sufficiente utilizzare un tipo che è un antenato comune a entrambi. In questo caso, sarebbe Object (poiché String e Double ereditano entrambi da Object). Ciò richiederà di controllare i tipi, tuttavia, quando li recuperi o li usi.

Se si utilizza un numero fisso di più tipi diversi, quello che si desidera veramente è una "tupla". Tuttavia, Java attualmente non ha un'implementazione di tupla disponibile. Per due elementi:

public class Pair<T1,T2> 
{ 
    public Pair(){ 
      this(null,null); 
    } 

    public Pair(T1 x1){ 
      this(x1,null); 
    } 

    public Pair(T1 x1, T2 x2){ 
     _x1 = x1; 
     _x2 = x2; 
    } 

    public T1 getFirst(){ 
     return _x1; 
    } 

    public T1 getSecond(){ 
     return _x2; 
    } 

    private T1 _x1; 
    private T2 _x2; 
} 
2

si può solo fare ArrayList<object> arraylist e poi si può mettere nulla in essa, ma che potrebbe non essere ciò che si desidera.

Quindi, per ordinare si dovrebbe semplicemente utilizzare il proprio comparatore ma, come è stato detto in precedenza, questi due valori dovrebbero essere collegati, oppure si dispone di un array a dimensione singola con due tipi di dati diversi?

5

È possibile utilizzare ArrayList<Object> e quindi è possibile utilizzare qualsiasi cosa desideri. Incapsulare double in un oggetto Double e quando si recupera l'oggetto, utilizzare instanceof per verificare se si tratta di un valore reale di double o String.

Devo dire, è improbabile che questo "design" possa aggiudicarti qualche premio. È possibile ripensare la soluzione che stai prendendo in considerazione per il tuo problema, e vedere se potresti fare con un diverso tipo di approccio?

3

Si potrebbe già sapere questo, ma non è certamente una buona idea memorizzare tipi diversi in un elenco. Per definizione, un array è una raccolta di oggetti simili e il riempimento di tutti i tipi in esso rende le cose confuse. Quindi in realtà preferiresti avere un tipo separato per contenere questi valori diversi.

2

Un ArrayList per definizione contiene solo un oggetto per posizione. Si potrebbe fare qualcosa di simile:

List<MyTuple> list = new ArrayList<MyTuple>(); 

public static class MyTuple implements Comparable<MyTuple> { 

    private Double doubleValue; 
    private String stringValue; 

    //getters and setters 

    public int compareTo(MyTuple tuple) { 
     return doubleValue.compareTo(tuple.getDoubleValue()); 
    } 
} 

è quindi possibile utilizzare il metodo Collections.sort() per ordinare DAL Doubles.

0

Si consiglia di osservare la classe di base Number.

List<Number> list = new ArrayList<Number>(); 
list.add(new Integer(3)); 
list.add(new Double(5.2)); 

Si può interpretare i numeri come stringhe, utilizzando NumberFormat:

NumberFormat formatter = new DecimalFormat("#.##"); 
String s = formatter.format(list.get(0)); 

Anche se questo potrebbe non essere ciò che si vuole, si è un po 'a corto di dettagli circa il vostro obiettivo finale.

0

se si sta in fondo non cercando di fare qualsiasi confronto/smistamento sul ArrayList allora si potrebbe creare qualcosa come di seguito:

lista Lista = new ArrayList();

altrimenti .. La risposta di Jon Skeet è stata l'approccio migliore.