Кратчайший способ приведения массива 2d int в 2d double - PullRequest
5 голосов
/ 15 марта 2012

У меня есть метод, который получает только double[][], на который я хотел бы передать int[][], есть ли короткий способ сделать это в Java, такой простой как:

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

Ответы [ 6 ]

19 голосов
/ 15 марта 2012

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

Ярлыка нет.

2 голосов
/ 15 марта 2012

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

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

0 голосов
/ 14 сентября 2016

В Java 8 вы можете преобразовать одномерный массив int s в массив double s:

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];
    }
}
0 голосов
/ 31 августа 2016

Хм, мой код, написанный на 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 голосов
/ 15 марта 2012

Вы можете сделать это так:

    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];
    }

Редактировать: как указывал Andreas_D, это работает только в том случае, если все строки имеют одинаковую длину, если вам нужна переменная длина, вам придется пройти второй цикл for для переменного количества столбцов.

0 голосов
/ 15 марта 2012

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

РЕДАКТИРОВАТЬ: Только если double был супер или подкласс класса int, это может возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...