2012-03-14 15 views

risposta

18

Sfortunatamente l'unico modo per trasmettere l'array è iterare attraverso ciascun elemento e lanciarli uno alla volta mentre si reinserisce nel nuovo array double[][].

Nessuna connessione.

+1

Sei sicuro ... ??? – Lion

+4

Sì. Le mie fonti sono le mie ricerche sull'argomento. ;) Google ti porterà alla stessa conclusione. – Vache

+0

+1. Questa è l'unica strada. Affare. –

0

Non puoi scriverli, i doppi sono disposti in memoria diversi da quelli di Ints, questo non è il caso di cambiare semplicemente il loro nome.

EDIT: Solo se doppia era un super o sottoclasse classe di int allora potrebbe essere possibile.

+0

Questa non è una risposta molto utile. Anche se fossero disposti allo stesso modo (cioè entrambi i 32 bit), non potevi ancora scriverli. Il sistema di tipi Java semplicemente non lo consente. – Jochen

+0

Immagino che quello che sto cercando di trasmettere sia che non si tratta di una sottoclasse dell'altro, quindi il casting non ha senso. Il fatto che siano a 32 bit non implica che siano disposti allo stesso modo. Ma capisco il tuo punto. – Sandro

2

No, non è la digitazione corretta. int [] è un tipo e double [] è un tipo e non hanno alcuna relazione, quindi tali assegnazioni non sono consentite. Pertanto, non c'è modo di lanciarlo.

Dovrai copiare gli elementi (puoi assegnare un int a un doppio senza eseguire il casting).

0

Si può fare in questo modo:

int[][] intarray = {{1, 2}, {5, 6}}; 

    double[][] doublearray = new double[intarray.length][intarray[0].length]; 

    for(int i = 0; i < intarray.length; i++) 
    { 
     for(int j = 0; j < intarray[0].length; j++) 
      doublearray[i][j] = (double) intarray[i][j]; 
    } 

Edit: come Andreas_D sottolineato, questo funziona solo se tutte le righe sono della stessa lunghezza, se si vuole lunghezza variabile, dovrete attraversare il secondo ciclo per una quantità variabile di colonne.

+4

Funziona solo se tutte le righe hanno la stessa lunghezza. –

+0

Non hai davvero bisogno di fare il casting, quindi puoi omettere "(double)". @Andreas; sì. – Martin

0

Hmm, il mio codice scritto in Java 8 è chiamato il collegamento?

import java.util.Arrays; 

// ... 

/// Cast! 
int[][] int2DArray = {{3, 1}, {3, 3, 7}, {}}; 
Object[] arrayOfUntypedArraies = Arrays.stream(int2DArray).map(intArray -> Arrays.stream(intArray).asDoubleStream().toArray()).toArray(); 
double[][] double2DArray = Arrays.copyOf(arrayOfUntypedArraies, arrayOfUntypedArraies.length, double[][].class); 

/// Print! 
System.out.println(Arrays.deepToString(int2DArray)); 
// [[1, 2], [5, 6, 7], []] 
System.out.println(Arrays.deepToString(double2DArray)); 
// [[1.0, 2.0], [5.0, 6.0, 7.0], []] 
0

In Java 8 si può lanciare una matrice 1-dimensionale int s in una matrice di double s:

double[] singleDimensionDoubleArray = 
     Arrays.stream(singleDimensionIntArray).asDoubleStream().toArray() 

ho pertanto scritto quello che ho assunto sarebbe una versione più veloce dal loop sopra la righe:

int[][] iArray = { 
    {1, 2,}, 
    {5, 6,} 
}; 

double[][] dArray = new double[iArray.length][]; 
for (int row = 0; row < iArray.length; row++) { 
    dArray[row] = Arrays.stream(iArray[row]).asDoubleStream().toArray(); 
} 

Stavo per pubblicare questa risposta, ma ho pensato di postare alcuni parametri su quanto più veloce è stato che ingenuamente ciclare su ogni elemento. Si scopre che era intorno a 10x più lento! L'ho testato con un array di zeri 10000x1000. Suppongo che sia la creazione di oggetti extra che causa il rallentamento.

A meno che qualcun altro può dimostrare il contrario, penso che la soluzione più semplice è in realtà il più veloce:

for (int row = 0; row < iArray.length; row++) { 
    for (int column = 0; column < iArray[0].length; column++) { 
     dArray[row][column] = (double) iArray[row][column]; 
    } 
}