2013-05-13 1 views
-3

Мне нужно перевернуть 1-мерный массив из 64 элементов (я могу переключиться на ints, если это проще, но я предполагаю, что те же процессы будет работать для обоих) на его голове в Java. Я представляю его здесь как квадратный стол для удобства понимания, поскольку фактическая проблема находится на шахматной доске.Как перевернуть строки в массиве 1D short/int, представляющем 2D-массив в Java

Например:

short[] example = new short[] 
{ 
    1, 2, 3, 
    4, 5, 6, 
    7, 8, 9 
}; 

стал бы:

7 8 9 
4 5 6 
1 2 3 

Пожалуйста, обратите внимание, что это НЕ же, как и реверсирования массив (каждый Ответчик на подобные вопросы я нашел сделал это ошибка, следовательно, я должен спросить!). Реверсивный массив даст:

9 8 7 
6 5 4 
3 2 1 

Извинение, если я пропустил какую-либо важную информацию, любая помощь приветствуется!

EDIT: массив 1D и содержит 64 элемента, поэтому короткий [64], а реверсивный массив отделен от оригинала. Насколько я пробовал, я просто пытаюсь обвести вокруг себя голову. Я знаю, как обратный массив, но это не то, что я после этого, и я первоначально пытался обратить индекс с помощью:

byte index = (byte)(((byte)(position + 56)) - (byte)((byte)(position/8) * 16)); 

который является фрагментом кода я нашел на Chessbin, но это возвращает неверные значения и дает ошибки IndexOutOfBounds. Оглядываясь назад, мне не ясно, должен ли этот код перевернуть индекс или отменить его. Поскольку математика не мой сильный костюм, я попытался обойти его с помощью отдельных массивов.

+12

Вы пропустили то, что вы пытались –

+3

Как выглядит этот массив в коде? Это 'short [] []'? Вы еще что-нибудь пробовали? Была ли ошибка? – thegrinner

+1

Является ли это многомерным массивом ? – Adarsh

ответ

0

У вас есть физический 1D-массив, представляющий логический 2D-массив, и вы хотите поменять местами строки. Вы можете сделать это частично, сопоставляя индексы 2D-массива в индекс массива 1D.

Пусть height - количество строк, а width - количество столбцов.

for (int i = 0; i < height/2; ++i) { 
    int k = height - 1 - i; 
    for (int j = 0; j < width; ++j) { 
     short temp = array[i * width + j]; 
     array[i * width + j] = array[k * width + j]; 
     array[k * width + j] = temp; 
    } 
}  

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

Возможно, вы сможете оптимизировать работу с помощью 2D-массива, который позволит вам заменять ссылки на строки в O (высота), а не копировать все строки в O (высота * ширина).

2

Мое предложение было бы так:

public class Flipper { 

    public short[] flip(short[] array, int columns) { 
     short[] flipped = new short[array.length]; 
     for(int i=0;i<array.length;i++){ 
      int row = (i/columns); //use the fact that integer/integer is rounded down 
      int column = (i%columns); 
      flipped[i] = array[array.length-((columns*(row+1))-column)]; 
     } 
     return flipped; 
    } 

} 

который может быть протестирована с:

public class FlipperTest { 

    private Flipper flipper = new Flipper(); 

    @Test 
    public void test() { 
     short[] array = new short[]{1,2,3,4,5,6,7,8,9}; 
     short[] actualResult = flipper.flip(array, 3); 
     assertThat(actualResult, equalTo(new short[]{7,8,9,4,5,6,1,2,3})); 
    } 

} 

Надежда код самостоятельно пояснительная

+1

+1 для решения с одним контуром. Не на месте, но можно легко сделать на месте. Менее читаемо для меня. Примечание: «строка» основана на 1, а «столбец» - на основе 0; что заслуживает упоминания в коде, предпочтительно в имени переменной или, по крайней мере, в документации. –

+0

@ Энди Томас-Крамер - Согласитесь, ответьте на улучшение – macias