2012-03-14 1 views
5

У меня есть метод, который получает только double[][], к которому я хотел бы передать int[][], есть короткий способ сделать это в Java, что-то же просто, как:Кратчайший способ бросить 2d целочисленного массива в 2d двойного

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

ответ

18

К сожалению, единственный способ сделать свой массив - перебирать каждый элемент и отбрасывать его один за другим при повторной установке в новый массив double[][].

Нет ярлыка.

+1

Вы уверены, что ... ??? – Lion

+4

Да. Мои источники - это мои собственные исследования по этому вопросу. ;) Гуглинг вокруг приведет вас к такому же выводу. – Vache

+0

+1. Это единственный способ. По рукам. –

0

Вы не можете их отличить, двойники разложены по-разному в памяти, чем ints, это не случай простого изменения их имени.

EDIT: Только если double был классом супер или подкласса int, тогда он может быть возможно.

+0

Это не очень полезный ответ. Даже если они были выложены одинаково (т. Е. Оба 32 бита), вы все равно не могли их отличить. Система типа Java просто не позволяет этого. – Jochen

+0

Я предполагаю, что я пытаюсь понять, что он не является подклассом другого, поэтому кастинг не имеет смысла. Тот факт, что они 32биты не означает, что они выложены одинаково. Но я вижу вашу точку зрения. – Sandro

2

Нет, это неверно печатать. int [] является типом и double [] является типом, и они не имеют отношения, поэтому такие присвоения не допускаются. Поэтому нет никакого способа сделать это.

Вам нужно будет скопировать элементы (вы можете назначить int двойнику без кастинга).

0

Вы можете сделать это следующим образом:

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 отметил, это работает только, если все строки имеют одинаковые длины, если вы хотите переменную длину, вам придется пройти через второй для цикла для переменной суммы столбцов.

+4

Это работает только в том случае, если все строки имеют одинаковую длину. –

+0

Вам не нужно делать кастинг, так что вы можете omitt "(double)". @Andreas; да. – Martin

0

Хмм, мой код, написанный на Java 8, стоит называть ярлык?

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

В Java 8 вы можете отбрасывать 1-мерный массив int с в массив double с:

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

поэтому я написал то, что я предположил бы более быстрый вариант, обернув над строки:

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

Я как раз собирался опубликовать этот ответ, но думал, что я бы разместить некоторые метрики о том, насколько быстро это было, что наивно цикл по каждому элементу. Оказывается, это было около 10x медленнее! Я тестировал его с массивом нулей в 10000x1000. Я полагаю, что создание дополнительного объекта вызывает замедление.

Если кто-то еще не может доказать обратное, я думаю, что самое простое решение на самом деле самый быстрый:

for (int row = 0; row < iArray.length; row++) { 
    for (int column = 0; column < iArray[0].length; column++) { 
     dArray[row][column] = (double) iArray[row][column]; 
    } 
} 
Смежные вопросы