2013-05-30 2 views
1

У меня есть массив 9x9 2D, который я хочу разбить на массив из 9 3x3 2D-массивов.Разделить 2D-массив в массив из нескольких меньших массивов?

Вот то, что я до сих пор:

int board[][] = new int[9][9]; 

// Fill board with numbers... 

int[][] nw, n, ne, w, c, e, sw, s, se = new int[3][3]; 
int[][] sections = { { nw, n, ne }, { w, c, e }, { sw, s, se } }; 

После:

  • nw[][] будет состоять из board[0][0] через board[3][3].
  • n[][] состоит из board[4][0] через board[6][3]
  • и т.д.

Что лучший способ сделать это без ручного добавления каждого отдельного элемента к нужному разделу?

+3

Вам действительно нужны отдельные массивы для каждого раздела, или вы просто хотите указать на те области в исходном массиве? Если последнее, вы, вероятно, можете создать класс, в котором каждый экземпляр представляет каждый конкретный раздел, и, как вы его называете, вы извлекаете фактическое значение с доски [] [], но абстракция этого класса поможет вам легко увидеть его как просто раздел. Просто идея ... Надеюсь, это не слишком смущает. –

+0

Пахнет судоку ... Я предлагаю вам использовать цикл for, так как вы знаете первую и последнюю строки и первый и последний столбцы для «досок» в «доске». –

+0

Для каждого из них вам понадобится '= new int [3] [3]'. В настоящее время вы просто инициализируете 'se'. – Dukeling

ответ

2

java.util.Arrays.copyOfRange() может помочь вам в этом.

+0

Или' System.arraycopy' как довольно быструю реализацию. – tkroman

+0

Как использовать copyOfRange() с 2D-массивами? Каждый пример, который я могу найти о том, как его использовать, показывает только 1D массивы. – Petefic

0

Java не допускает субиндекс массивов.

Что вы имеете в виду тривиальным возможно в C, но в Java вам нужно будет либо:

  • копию данных в новых массивах
  • использовать пользовательский класс абстрагироваться от хранения.

В Java, нет никакого способа, которым foo[0]постоянно относится к элементу bar[3] другого массива.

Если вы хотите работать с int[][], вам придется скопировать массивы. Arrays.copyOfRange и System.arraycopy будут наиболее эффективным выбором, но в размере Sudoku он явно не имеет большого значения.

Для второго подхода напишите обычай Matrix класс. Например

class Matrix { 
    int[] flatStorage; 
    int[] offsets; 

    Matrix(int[] flatStorage, int[] offsets) { 
    this.flatStorage = flatStorage; 
    this.offsets = offsets; 
    } 

    void set(int x, int y, int val) { 
    flatStorage[ offsets[x] + y ] = val; 
    } 

    int get(int x, int y) { 
    return flatStorage[ offsets[x] + y ]; 
    } 
} 

int[] sharedStorage = new int[27]; 
Arrays.fill(sharedStorage, -1); // Initialize with -1 

int[] allOffsets = new int[]{0,9,18, 27,36,45, 54,63,72}; 
Matrix nineByNine = new Matrix(sharedStorage, allOffsets); 
Matrix northEast = new Matrix(sharedStorage, new int[]{6,15,24}); 
Matrix southEast = new Matrix(sharedStorage, new int[]{60,69,78}); 

nineByNine.set(1,7, 2); // Write to middle of upper right quadrant 
System.err.println(northEast.get(1, 1)); // Read - should be 2! 

Добавить информацию о размере и подобных вещах самостоятельно.

+0

Ха-ха, я помню, когда я начинал, я пытался подсетить массив, как это было бы сделано в python. Спустя годы несколько приятелей и я добавляем это на язык, похожий на Java haha. Мне нравится подход ООП к этому методу. Очень чистый код –

0

Вы рассмотрели бы следующее решение "manual"? Объявить

int[][] getSection(int x, int y) { 
    int[][] result = new int[3][3]; 
    for (int i=0; i<3; i++) { 
     for (int j=0; j<3; j++) { 
      result[i][j] = board[3+x+1][3*y+j]; 
     } 
    } 
    return result; 
} 

затем вызвать

nw = getSection(0,0); 
n = getSection(1,0); 

т.д.

1

звучит как вписанное!

Я решил, как эту проблему в прошлый раз вы можете разделить 9x9 массив в (9) 3X3 массивы

вы можете сделать это таким образом:

void getSection(int board[9][9],int result[3][3],int x, int y) 
{ 
    for (int i=0; i<3; i++) { 
     for (int j=0; j<3; j++) { 
      result[i][j] = board[3*x+i][3*y+j]; 
     } 
    } 
} 

после этого вызова getSection для каждой секции в массиве 9X9:

int s[9][9]; 
int s1[3][3]; 

    for(i=0;i<3;i++) 
     { 
      for(j=0;j<3;j++) 
      { 
       getSection(s,s1,i,j); 
      } 
     } 

или вы можете сделать это вручную:

раздел 0:

getSection(s,nw,0,0); 

Раздел 1:

getSection(s,n,0,1); 

Раздел 2:

getSection(s,ne,0,2); 

Раздел 3:

getSection(s,w,1,0); 

т.д.

отмечают, что решение Вашего вопроса в C++ но основная идея заключается в том же, в Java и C++.

Смежные вопросы