Как элегантно скопировать многомерные массивы в Java? - PullRequest
3 голосов
/ 22 февраля 2012

После того, как выяснилось, что clone () не работает так, как предназначено для многомерных массивов, теперь я пишу

for(int k = 0; k < Nz; k++){
    for(int j = 0; j < Ny; j++){
        for(int i = 0; i < Nx; i++){
            grid_copy[i][j][k] = grid[i][j][k];
        }
    }
}           

для каждого массива.Это так удручающе низкий уровень и анти-СУХОЙ.Кто-нибудь может предложить более общий способ сделать это?

Ответы [ 3 ]

2 голосов
/ 22 февраля 2012

В этом официальном руководстве объясняется, как использовать метод arraycopy для эффективного копирования данных из одного массива в другой. Я думаю, что это работает только для одномерных массивов, но вы можете использовать его для копирования различных «блоков одномерного массива», содержащихся в вашей трехмерной сетке. Вы можете найти это полезным!

2 голосов
/ 22 февраля 2012

Если вам действительно нужен универсальный копир, я просто описал это здесь и провел базовое тестирование.Это интересно, но я не думаю, что это лучше, потому что то, что вы приобретаете в гибкости, теряется в удобочитаемости.

private void copy(Object source, Object dest) {
    if(source.getClass().isArray() && dest.getClass().isArray()) {
        for(int i=0;i<Array.getLength(source); i++) {
            if(Array.get(source, i) != null && Array.get(source, i).getClass().isArray()) {
                copy(Array.get(source, i), Array.get(dest, i));
            } else {
                Array.set(dest, i, Array.get(source, i));
            }
        }
    }
}
0 голосов
/ 22 февраля 2012

Я не знаю более общего способа сделать это. Я бы просто определил функцию для этого.

  public void copyMultidimensionalArray(int[][][] destination,int[][][] source)
    {
        // your above code here   
    }

И тогда я бы просто вызывал эту функцию каждый раз.

 copyMultidimensionalArray(grid_copy,grid);

Разве я не могу стать более элегантным?

Обратите внимание, что в приведенном выше примере используются только целочисленные массивы. Конечно, вы можете сделать его более универсальным, используя массивы типа Object.

...