Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Java программирование > Общие вопросы по Java, Java SE, Kotlin
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2017, 19:22   #1
sameuser
Пользователь
 
Регистрация: 22.12.2016
Сообщений: 22
Вопрос Вопрос по работе с массивами

Привет.
У меня есть массив объектов класса Cell размером 10 на 10 (игровое поле): Cell[][] Area = new Cell[10][10];

У каждого объекта класса Cell есть свойство String status, которое по умолчанию имеет значение "empty".
А также еще 2 свойства - координаты - int y, int x.

У некоторого количества объектов Cell свойство status вскоре будет изменено на "filled", остальные останутся с "empty".

Что нужно сделать: получить двумерный массив координат клеток со статусом "filled" (то есть массив интов y and x).

Есть такая реализация:
а) подсчитываю количество объектов со статусом "filled"
б) зная точное количество, создаю массив с фиксированным размером и заполняю его

Код:
    public int[][] getFilledCellsCoordinats ( )  
    {
        int counter = 0; // счетчик объектов для последующего создания массива
        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if ( Area[i][j].getStatus().equals("filled") )
                    counter++;
            }
        }

        // Теперь известно точное количество объектов класса Cell со статусом "filled". Теперь Создаем массив фиксированного размера
        // Двумерный массив по количеству объектов со статусом "filled" плюс 2 координаты
        int[][] allCoords = new int[counter][2]; 

        int newcounter = 0;

        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if ( Area[i][j].getStatus().equals("ship") ) {
                    allCoords[newcounter][0] = i;
                    allCoords[newcounter][1] = j;
                    newcounter++;
                }
            }
        }
        return allCoords;
    }
Этот код работает исправно и решает поставленную задачу, но мне он не нравится, т.к. наблюдается избыточность.. А именно мне приходится дважды пробегать по одному и тому же циклу. Думаю, есть способы упростить этот код до одного цикла, но как именно это сделать - не знаю.

Я пробовал использовать ArrayList, но не смог довести до конца.. Когда добавляешь в него какое-то одиночное значение, то всё просто.. Будь то стринг, инт или еще что-то.. А тут мне приходится добавлять массив. И извлечь этот массив потом через .iterator() мне не удалось.

Забуксовал я на этот коде.. Кажется, рядом есть простое решение, но почему-то я его не вижу.
sameuser вне форума Ответить с цитированием
Старый 05.10.2017, 22:03   #2
sameuser
Пользователь
 
Регистрация: 22.12.2016
Сообщений: 22
По умолчанию

Решил-таки..

Код:
 public int[][] getliveCellsCoordinats ( )
    {
        List<int[][]> allCoords = new ArrayList<int[][]>();

        for (int i = 0; i < 10; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if ( Area[i][j].getStatus().equals("filled") ) {
                    allCoords.add( new int[][] { {i,j} } ); //кто бы мог додуматься, что массив можно задать вот так.. 
                }
            }
        }

        int[][] remainCoords = new int[allCoords.size()][2];
        int icounter = 0;

        for ( Iterator<int[][]> iter = allCoords.iterator(); iter.hasNext(); )
        {
            int[][] elem = iter.next();
            remainCoords[icounter][0] = elem[0][0];
            remainCoords[icounter][1] = elem[0][1];
            icounter++;
        }
        return remainCoords;
    }
Наверное, так лучше. А вы как думаете?
sameuser вне форума Ответить с цитированием
Старый 06.10.2017, 03:11   #3
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Хз, особо не думали, но уже видно типичная ошибка новичка - будут проблемы и внезапные краши

Код:
Area[i][j].getStatus().equals("ship")
Привыкайте писать так

Код:
"ship".equals(Area[i][j].getStatus());
т.о. слева от точки всегда гарантировано не null
alexzk вне форума Ответить с цитированием
Старый 07.10.2017, 17:07   #4
sameuser
Пользователь
 
Регистрация: 22.12.2016
Сообщений: 22
По умолчанию

Спасибо за ответ. Нет ничего полезнее конструктивной критики в этом деле
Только немного поясните..
Вы хотели сказать, что в моем коде Area[i][j] может быть null'ом, так? И если это так, то при вызове метода getStatus() выбосится исключение NullPointer. Соответственно, до сравнения со "ship" дело не дойдет - программа остановится.

А если мы сравниваем стринг "ship" с Area[i][j].getStatus(), который оказывается null, мы просто получим false.

Я верно понял вашу мысль?
sameuser вне форума Ответить с цитированием
Старый 09.10.2017, 02:43   #5
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от sameuser Посмотреть сообщение
Спасибо за ответ. Нет ничего полезнее конструктивной критики в этом деле
Только немного поясните..
Вы хотели сказать, что в моем коде Area[i][j] может быть null'ом, так? И если это так, то при вызове метода getStatus() выбосится исключение NullPointer. Соответственно, до сравнения со "ship" дело не дойдет - программа остановится.

А если мы сравниваем стринг "ship" с Area[i][j].getStatus(), который оказывается null, мы просто получим false.

Я верно понял вашу мысль?
именно так, вопщем у вас может и не быть null, но в целом случается в java часто, так что привыкайте писать литерал-строку слева от точки. Просто на будущее.
alexzk вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Borland c++ ошибка при работе с массивами all_is_fear Помощь студентам 2 05.11.2011 23:11
Ошибка при работе с динамическими массивами GBAXA Общие вопросы Delphi 16 30.03.2011 09:28
процедуры и функции при работе с массивами irina belka Помощь студентам 1 12.12.2010 16:33
Функции и процедуры в работе с массивами Qwerty91 Помощь студентам 0 13.12.2009 14:22
Программа по работе с массивами Kamikadze_666 Общие вопросы C/C++ 2 16.12.2008 18:29