Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Заполнить двумерный массив числами


Автор: hayaname 19.12.2012, 10:12
Уважаемые, форумчане!

Прошу Вашей подсказки по реализации такого алгоритма:

Дана, к примеру матрица 5 на 5:

int width = 5;
int hight = 5;

byte[][] matrix = new byte[this.hight][this.width];

Данный массив (matrix) нужно заполнить 0 и 1 по массиву mass:
int[] mass = {2, 0, 3, 1 и тд}

Массив mass формируется по алгоритму RLE, то есть последовательность:
00111 будет записана как - 2 0 3 1, то есть первое число это количество символов, а второе число - каких именно символов.


Так вот вопрос - как заполнить массив matrix по массиву mass:
Думал сделать так:

Код:

Код

int count = 0;
int number = 0;
int poss = 0;
int x = 0;
int y = 0;
 
for (int i = 0; i < mass.length; i++ )
          {
              count = mass[poss];
              number = mass[poss+1];
                  poss = poss+2;
 
for (; x < matrix.length; x++) {
                    for (y = 0; y < count; y++) {    
                     
                     if (y>4)
                     {
                         x++;
                         break;
                     }
                     else
                         
                         
                     if (number == 0)
         {
 
massb[y][x] = 0;
    break;
                    }                    
 
                     else
                         
         if (number == 1)
         {
 
        massb[y][x] = 1;    
                    }
}
}
}



Но выбрасывает с этой ошибкой:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsExce ption: 4

Надеюсь на помощь

Автор: 4epT 19.12.2012, 11:28
Заполнять нужно последовательно ? Или по какому то принципу ?

Автор: hayaname 19.12.2012, 11:37
4epT, последовательно

Автор: 4epT 19.12.2012, 12:11
Как то так:

matrix - матрица которая будет заполняться. arr - массив по которому будет заполняться матрица.

Код

public static int[][] fillMatrix(int[][] matrix, int[] arr){
        
        if(arr == null || arr.length %2 != 0){
            return null;
        }
        
        if(matrix == null || matrix.length == 0){
            return null;
        }
                
        
        int count = -1;
        int value = -1;
        
        int currentPosMatrixJ = 0;
        int currentPosMatrixK = 0;
        
        for(int i = 0; i < arr.length; i += 2){
            
            count = arr[i];
            value = arr[i+1];
            
            if(count <= 0){
                continue;
            }
            
            int height = matrix.length;
            int width = matrix[0].length;
            
            for(int j = currentPosMatrixJ; j < height; j++){
                
                for(int k = currentPosMatrixK; k < width;){
                    
                    matrix[j][k] = value;
                    
                    count--;
                    
                    k++;
                    
                    if(count == 0){
                        currentPosMatrixJ = j;
                        currentPosMatrixK = k;
                        
                        if(k == width){
                            currentPosMatrixK = 0;
                            currentPosMatrixJ++;
                        }
                        
                        k = width;
                        j = height;
                    } else {
                        if(k == width){
                            currentPosMatrixK = 0;
                            currentPosMatrixJ++;
                        }
                    }
                    
                    
                    
                }
                
            }
            
        }
        
        return matrix;
        
    }

Автор: hayaname 19.12.2012, 13:13
4epT

Только не пойму вот этого места:

Код

if(k == width){
                            currentPosMatrixK = 0;
                            currentPosMatrixJ++;

                        }
                        
                        k = width;
                        j = height;
                    } else {
                        if(k == width){
                            currentPosMatrixK = 0;
                            currentPosMatrixJ++;

                        }
                    }


Зачем два раза проверка такая?

Автор: 4epT 19.12.2012, 13:19
Это такая ситуация когда кол-во значений которое еще нужно добавить (count) еще не 0, но нужно сделать перевод на новую строку. Это можно все оптимизировать, но я над этим не замрочивался)

Автор: hayaname 19.12.2012, 13:33
4epT
Понятно, тогда последний вопрос?))

Код

int height = matrix.length;
            int width = matrix[0].length;
            
            for(int j = currentPosMatrixJ; j < height; j++){
                
                for(int k = currentPosMatrixK; k < width;){


Используется int width = matrix[0].length; - то есть пока k меньше ширины строки...так как матрица n*n - то получается нет смысла использовать  int width = matrix[height].length;


Так?

Автор: 4epT 19.12.2012, 13:41
Если матрица n*n, то да. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)