Я решаю следующую задачу : В первой строке задано n - количество строк матрицы. Во второй - m - количество столбцов. Числа m и n не превосходят 1000. В следующих n строках задана матрица. Элементы матрицы - целые числа, по модулю не превосходящие 1000. В последних двух строках записаны координаты элемента (индексация начинается с нуля), соседей которого нужно найти.(т.е найти нужно все соседние , кроме диагональных).
В моей программе index1 и index2 - это те индексы , вокруг которых нужно вывести соседей.На этой строчке программа падает когда мы вводим 0 :boolean b=Arrays.asList(array).contains(array[index1-1][index2]); и выдает ArrayIndexOutOfBoundsException , я понимаю что оно выходит за пределы массива , но это же подразумевается как проверка на содержание в массиве , вообщем я не знаю как с этим разобраться
package com.company;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static int[][] array;
public static void main(String[] args) {
Scanner scann = new Scanner(System.in);
int n =scann.nextInt();
int m =scann.nextInt();
array = new int[n][m];
for(int i = 0 ; i < n ; i++){
for(int j = 0;j < m ; j++){
array[i][j] = scann.nextInt();
}
}
int index1 =scann.nextInt();
int index2 =scann.nextInt();
boolean b=Arrays.asList(array).contains(array[index1-1][index2]);
boolean c=Arrays.asList(array).contains(array[index1][index2-1]);
boolean d=Arrays.asList(array).contains(array[index1+1][index2]);
boolean e= Arrays.asList(array).contains(array[index1][index2+1]);
if (b == true){
System.out.print(array[index1-1][index2]+ " ");
}
if (c == true){
System.out.print(array[index1][index2-1]+ " ");
}
if (d == true){
System.out.print(array[index1+1][index2]+ " ");
}
if (e == true){
System.out.print(array[index1][index2+1]+ " ");
}
}
}
Anonymous #2595387
32 уровень
Помогите убрать или обойти ошибку ArrayIndexOutOfBoundsException
Решен
Комментарии (5)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Serhii.S
25 апреля 2021, 17:45
Совет 1: используйте инструмент "Выделить код" когда задаете вопрос.
Совет 2: уйдите от описанной выше логики построения решения задачи.
- после ввода всех необходимых элементов создайте строку-результат;
- создайте два вложенных цикла for для обхода матрицы 3х3 вокруг элемента-цели, соседей которого нужно найти, соответственно счетчики i = index1+-1, j = index2+-1;
- в теле цикла делайте проверку на выход обоих индексов за пределы размера массива, если выходит -continue, если оба индекса соответствуют индексам элемента-цели - continue; если элемент диагональный (i != index1 ^ j != index2) - continue, если ни одно условие не выполнилось - только тогда обращайтесь к элементу массива и добавляйте элемент в строку результат.
Решение, возможно, не самое оптимальное т.к. нужно вывести максимум 4 элемента, а крутить циклы надо 9 раз, но зато универсальное.
0
Anonymous #2595387
25 апреля 2021, 18:53
У меня в задаче ограничение по времени и памяти , пока думаю как можно эффективнее
0
Serhii.S
25 апреля 2021, 19:06
Ограничения указаны явно? Когда найдете более эффективный (и\или красивый) способ решения поделитесь пожалуйста. Можно в личку. (не подумайте, не для критики, а для анализа кода и Вашей, альтернативной для меня точки зрения). Заранее спасибо.
0
hidden #2322530
25 апреля 2021, 19:34
У меня в задаче ограничение по времени и памяти , пока думаю как можно эффективнее
поэтому ты используешь это?
+1
ГоффMaster
25 апреля 2021, 17:20
[index1-1]
[index2+1]
с такими вещами всегда надо аккуратно. Твоя ошибка именно здесь возникает
Arrays.asList(array).contains(array[index1-1][index2]) - всегда будет true, когда не вываливается по вышеописанной ошибке.
Если переменная используется один раз, то она не нужна. Я имею в виду b, c, d, e
if (b == true) - это масло масляное. b - она boolean, поэтому просто if (b)
0