Проверка границ позиции перед доступом к ней

Я пытаюсь распечатать двухмерный массив и определить элементы на север, юг, восток и запад от начального элемента. Я заполнил массив случайными целыми числами, но мне нужна помощь с печатью «-1» для этого направления, если направление выходит за пределы, вместо того, чтобы вызвать сбой всей программы.

import java.util.Scanner;

public class GetNeighbors
{

    public static void printRow(int[]row) 
        {
            for (int i : row) {
            System.out.print(i);
            System.out.print("\t");
        }
        System.out.println();
    }

    public static void main(String[]args)
    {
        Scanner kb=new Scanner(System.in);

        System.out.println("Please enter a number of rows");
        int r=kb.nextInt();
        System.out.println("Please enter a number of columns");
        int c=kb.nextInt();

        int[][]spot=new int[r][c];

        arrayWork(spot);
        directionWork(spot);

    }

    public static void arrayWork(int[][]spot)
    {   
        for(int i=0;i<spot.length;i++)
        {
            for(int j=0;j<spot[i].length;j++)
            {
                spot[i][j]=(int)(Math.random()*1001);
            }
        }
        for(int[]row:spot) 
            {
            printRow(row);
            }
    }

    public static void directionWork(int[][]spot)
    {
        Scanner kb=new Scanner(System.in);

        System.out.println("Please choose a row for an element");
        int row=kb.nextInt();
        System.out.println("Please choose a column for an element");
        int col=kb.nextInt();

        System.out.println("Requested neighbors for element at row "+row+", col "+col+" "+"("+spot[row][col]+")");

        System.out.print("North: "+spot[row-1][col]);
        System.out.print(" South: "+spot[row+1][col]);
        System.out.print(" East: "+spot[row][col+1]);
        System.out.print(" West: "+spot[row][col-1]);
    }
}

person Ahawk    schedule 19.01.2018    source источник


Ответы (1)


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

public static int getElement(int[][] spot, int row, int col) {
    if (row < spot.length && spot.length > 0 && row >= 0 && col < spot[row].length && spot[row].length > 0 && col >= 0) {
        return spot[row][col];
    } else {
        return -1;
    }
}

А затем измените свои операторы печати, чтобы вызвать его:

System.out.println("Requested neighbors for element at row "+row+", col "+col+" "+"("+getElement(spot, row, col)+")");

System.out.print("North: "+ getElement(spot, row - 1, col));
System.out.print(" South: " + getElement(spot, row + 1, col));
System.out.print(" East: " + getElement(spot, row, col + 1));
System.out.print(" West: "+ getElement(spot, row, col - 1));
person user4020527    schedule 19.01.2018
comment
Должны быть включены еще два условия. If [row+1] >= spot.length... также для столбца. - person zlakad; 19.01.2018
comment
@zlakad Нет, вам нужно только проверить индекс, к которому осуществляется доступ. - person user4020527; 19.01.2018
comment
System.out.println("Requested neighbors for element at row "+row+", col "+col+" "+"("+spot[row][col]+")"); также необходимо проверить. - person xingbin; 19.01.2018
comment
@ user27149 Спасибо, добавлено. - person user4020527; 19.01.2018
comment
Восток: getElement(spot, row, col + 1). Что, если col — самый левый столбец? (Это пример). - person zlakad; 19.01.2018
comment
@zlakad Я до сих пор не понимаю, что ты пытаешься донести. Условия, которые у меня есть, гарантируют, что row и col находятся в границах. - person user4020527; 19.01.2018
comment
Если я правильно понял вопрос, цель не в том, чтобы получить элемент двумерного массива. OP хочет получить соседей [строки] [столбца]... Кроме того, я могу ошибаться... - person zlakad; 19.01.2018
comment
@zlakad Он хочет получить соседей, убедившись, что они находятся в пределах границ. Каждый оператор печати вызывает метод getElement с соответствующими аргументами row и col для каждого отдельного соседа. - person user4020527; 19.01.2018
comment
Я пытаюсь напечатать, какой элемент является N S E и W, и если, например, вы выберете свое начальное местоположение как пятно [0] [0], ваши N и W оба будут равны -1, потому что они находятся за пределами границ. - person Ahawk; 19.01.2018
comment
Ну, мне кажется, я вообще не читал код. Извини, друг, мои намерения никоим образом не были негативными :) Здесь, в Сербии, 4:21 утра... Ага. - person zlakad; 19.01.2018
comment
@Ahawk Код, который я предоставил, должен выполнить это. - person user4020527; 19.01.2018
comment
По какой-то причине мне продолжают показывать Исключение в потоке main java.lang.ArrayIndexOutOfBoundsException: -1 error - person Ahawk; 19.01.2018
comment
@Ahawk Из какой строки это выбрасывается? - person user4020527; 19.01.2018
comment
38, 69, 78. Возможно, я забыл вызвать новый метод в main - person Ahawk; 19.01.2018
comment
@Ahawk Да, getElement проверяет, являются ли row и col >= 0, чтобы они не могли быть выброшены им. - person user4020527; 19.01.2018
comment
Ладно, думаю, теперь я знаю, что исправить. Спасибо! - person Ahawk; 19.01.2018
comment
@JacobWood Всякий раз, когда я ввожу 0 для int row и int col части метода directionWork, я получаю сообщение о выходе за пределы. Я делаю что-то неправильно? - person Ahawk; 22.01.2018
comment
@Ahawk Какой строкой брошен? (Не номер, скопируйте / вставьте строку, пожалуйста) - person user4020527; 22.01.2018
comment
Исключение в потоке main java.lang.ArrayIndexOutOfBoundsException: -1 в Ideone.getElement(Main.java:77) в Ideone.directionWork(Main.java:68) в Ideone.main(Main.java:37) - person Ahawk; 22.01.2018
comment
Нашел. Метод getElement имел неправильные целые имена; у них были строка и столбец вместо r и c. Спасибо - person Ahawk; 22.01.2018