2012-03-14 12 views
5

Ben, java gibi basit bir şey bunu yapmanın kısa yolu sadece ben int[][] geçmek istiyorum hangi double[][] alır bir yöntem yoktur adres:kısa yolu 2d çift

int [][] iArray = { 
      { 1, 2, }, 
      { 5, 6, } 
     }; 
double [][] dArray = (double[][]) iArray ; ??? 

cevap

18

Maalesef dizininizi yayınlamanın tek yolu, her öğe boyunca yinelemek ve yeni double[][] dizinize yeniden eklerken bunları tek tek atamaktır.

Kısayol yok.

+1

Emin misiniz ... ??? – Lion

+4

Evet. Kaynaklarım, konuyla ilgili kendi araştırmam. ;) Çevrenizde gezinmek sizi aynı sonuca götürecektir. – Vache

+0

+1. Bu tek yoldur. Anlaştık mı. –

0

Onları atamazsınız, iki misli bellekten farklı bir şekilde yerleştirilmiş, ancak bu onların adlarını değiştirmenin bir örneği değildir.

DÜZENLEME: Yalnızca çiftin bir süper veya alt sınıf sınıfı olması halinde olabilir.

+0

Bu çok yardımcı bir cevap değil. Aynı şeyleri koymuş olsalar bile (yani her ikisi de 32 bit), yine de onları yok edemezsiniz. Java tipi sistem buna izin vermiyor. – Jochen

+0

Sanırım karşılaşmaya çalıştığım şey, birinin diğerinin alt sınıfı olmaması, dolayısıyla dökümün mantıklı olmaması. 32bits onlar gerçeği aynı ortaya koydukları anlamına gelmez. Ama senin amacını görüyorum. – Sandro

2

Hayır, bu doğru yazım değil. int [] bir tür ve çift [] bir türüdür ve hiçbir ilişkisi yoktur, bu nedenle bu tür ödevlere izin verilmez. Bu nedenle, bunu yayınlamanın bir yolu yoktur.

Öğeleri kopyalamanız gerekir (döküm yapmadan çifte bir int atayabilirsiniz).

0

Böyle yapabilirsiniz:

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: Andreas_D belirttiği gibi, bu sadece tüm satırlar değişken uzunluk isterseniz çapraz gerekecek, aynı uzunluğunun ise işleri Değişken miktarda sütun için döngü için ikinci.

+4

Bu, yalnızca tüm satırların aynı uzunluğa sahip olması durumunda çalışır. –

+0

Döküm işlemini gerçekten yapmanız gerekmiyor, bu yüzden "(çift)" diyemezsiniz. @Andreas; Evet. – Martin

0

Hmm, Java 8 kodumda kısayolu olarak adlandırılan kod yazılıyor mu? Eğer double s bir diziye int s 1 boyutlu bir dizi yayınlayabileceğim Java 8'de

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

: Ben bu yüzden kabul yazdığını

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

üzerinde döngü ile daha hızlı bir versiyonunu olurdu satırlar:

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(); 
} 

Bu yanıt sonrası üzereydim ama safça her eleman olduğu üzerinde döngü ne kadar hızlı hakkında bazı ölçümleri göndermek düşündüm. Bu 10x daha yavaş etrafında çıktı! 10000x1000 sıfır dizisiyle test ettim. Sanırım yavaşlamaya neden olan fazladan nesne oluşturma. başkası başka türlü ispat edemediği sürece

, ben basit çözüm aslında en hızlı olduğunu düşünüyorum:

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