2015-06-23 5 views
1

Я понимаю эту проблему и решения на всем протяжении StackOverflow like here, однако я все еще не могу выполнить эту работу.Невозможно преобразовать значения массива 1d и 2d

Большинство примеров говорят, что мне просто нужно умножить строку по ширине и добавить столбец, что означает, что место (4, 3) в квадратной сетке 4x4 станет (3 * 4 + 4) или 16. Итак это так хорошо.

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

int x = 16/4; 
int y = 16 % 4; 

Но это работает для некоторых значений, а не для других. В этом случае, когда я возвращаю координаты после преобразования в индекс, я получаю (4,0). Это имеет смысл, так как 4 равномерно распределяется по 16, поэтому я должен упустить что-то основное.

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

public class Test { 

    int size; 

    public Test(int size) { 
     this.size = size; 
    } 

    public int toIndex(int x, int y) { 
     return x * this.size + y; 
    } 

    public int[] toCoordinates(int index) { 
     int coordinates[] = new int[2]; 
     coordinates[0] = index/this.size; 
     coordinates[1] = index % this.size; 
     return coordinates; 
    } 

    public static void main(String[] args) { 
     int testSize = 4; 
     Test test = new Test(testSize); 

     for (int i = 1; i <= testSize; i++) { 
      for (int j = 1; j <= testSize; j++) { 
       int index = test.toIndex(i, j); 
       int coordinates[] = test.toCoordinates(index); 
       System.out.println(index + " == " + coordinates[0] + "," + coordinates[1]); 
      } 
     } 
    } 
} 

Выход текущего кода

5 == 1,1 
6 == 1,2 
7 == 1,3 
8 == 2,0 
9 == 2,1 
10 == 2,2 
11 == 2,3 
12 == 3,0 
13 == 3,1 
14 == 3,2 
15 == 3,3 
16 == 4,0 
17 == 4,1 
18 == 4,2 
19 == 4,3 
20 == 5,0 
+0

Верхний левый - 0,0, нижний правый - 3,3. 0 - это первое число! – Nitram

+0

Я предполагаю, что ваше замешательство связано с использованием 1-индексированных массивов. Java использует 0-индексированные массивы, и я настоятельно рекомендую вам сделать то же самое. –

+0

Вот и все! Мне просто нужно было добавить 1 к размеру при выполнении вычислений. – Jim

ответ

2

Все массивы начинаются с 0, попробуйте следующее:

public static void main(String[] args) { 
    int testSize = 4; 
    Test test = new Test(testSize); 

    for (int i = 0; i < testSize; i++) { 
     for (int j = 0; j < testSize; j++) { 
      int index = test.toIndex(i, j); 
      int coordinates[] = test.toCoordinates(index); 
      System.out.println(index + " == " + coordinates[0] + "," + coordinates[1]); 
     } 
    } 
} 

Выход:

0 == 0,0 
1 == 0,1 
2 == 0,2 
3 == 0,3 
4 == 1,0 
5 == 1,1 
6 == 1,2 
7 == 1,3 
8 == 2,0 
9 == 2,1 
10 == 2,2 
11 == 2,3 
12 == 3,0 
13 == 3,1 
14 == 3,2 
15 == 3,3 (16th) 
+0

Начиная с 0 на массивах справа. Также обратите внимание, что на ответе Дэвида его индекс, который он печатает, начинается с 0. В вашем примере выводится ваш первый индексный вывод 5. – DrZoo

+0

Спасибо! Да, индексирование было проблемой. Мне все еще нужен 1 как индекс, потому что он подключается к чему-то другому, что требует его, однако я решил проблему, увеличивая размер во время конверсий. – Jim

0

Это выглядит, как вы swap x и y в вашем случае ошибки. Положение должно быть 19, а не 16.

Position [4,3] in a 4x4 array is (4*4)+3 = 19 
floor(19/4) = 4 
19 % 4 = 3 

С целью изучения массивов, я настоятельно рекомендую придерживаться нуля индексированных массивов, так как они более интуитивно связаны с тем, как содержанием на самом деле хранятся в памяти ,