Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заполнить двумерный массив числами 
:(
    Опции темы
hayaname
Дата 19.12.2012, 10:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.10.2011

Репутация: нет
Всего: нет



Уважаемые, форумчане!

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

Дана, к примеру матрица 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

Надеюсь на помощь
PM MAIL   Вверх
4epT
Дата 19.12.2012, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Заполнять нужно последовательно ? Или по какому то принципу ?
PM MAIL   Вверх
hayaname
Дата 19.12.2012, 11:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.10.2011

Репутация: нет
Всего: нет



4epT, последовательно
PM MAIL   Вверх
4epT
Дата 19.12.2012, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Как то так:

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;
        
    }

PM MAIL   Вверх
hayaname
Дата 19.12.2012, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.10.2011

Репутация: нет
Всего: нет



4epT

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

Код

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

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

                        }
                    }


Зачем два раза проверка такая?
PM MAIL   Вверх
4epT
Дата 19.12.2012, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Это такая ситуация когда кол-во значений которое еще нужно добавить (count) еще не 0, но нужно сделать перевод на новую строку. Это можно все оптимизировать, но я над этим не замрочивался)
PM MAIL   Вверх
hayaname
Дата 19.12.2012, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 17.10.2011

Репутация: нет
Всего: нет



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;


Так?
PM MAIL   Вверх
4epT
Дата 19.12.2012, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 784
Регистрация: 13.8.2007

Репутация: нет
Всего: 3



Если матрица n*n, то да. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0812 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.