Это связано с тем, что result
определен в области for-loop.
Пожалуйста, отформатируйте код, и вы увидите, что result
не является «видимым» из оператора return.
UPDATE: Дружественные остаток: Вы можете отформатировать выбранный код в затмение с shortkey: Ctrl + Сдвиг + F
отформатированный код:
public static int[][] splitArrayByNum(int[] input, int number){
if (input[0]==number)
for (int i = 0 ; i < input.length - 1 ; i++)
{
input[ i ] = input[ i + 1 ] ;
}
if ((input[(input.length)-1])==number)
for (int i = (input.length)-1 ; i < input.length - 1 ; i++)
{
input[ i ] = input[ i + 1 ] ;
}
int count = 0;
for (int i = 0; i < input.length; i++) {
if (input[i] == number) {
count++;
}
int[][] result = new int[count][];
int firstindex=0;
int lastindex=0;
for (int j=0; j<input.length; j++){
if (input[j]==number){
result[j]=Arrays.copyOfRange(input, firstindex, lastindex);
firstindex=lastindex=j;
}
lastindex++ ;
}
return result ;
}
Вы можете видеть, что у вас нет способа закрытия }
, и результат определяется в for-loop
объеме, и возвращается оттуда, но я считаю, что вы хотите вернуть result
после в for-loop, не так ли?
Я полагаю, что ваш код должен выглядеть следующим образом:
public static int[][] splitArrayByNum(int[] input, int number){
if (input[0]==number)
for (int i = 0 ; i < input.length - 1 ; i++)
{
input[ i ] = input[ i + 1 ] ;
}
if ((input[(input.length)-1])==number)
for (int i = (input.length)-1 ; i < input.length - 1 ; i++)
{
input[ i ] = input[ i + 1 ] ;
}
int count = 0;
for (int i = 0; i < input.length; i++) /*removed bracket here*/
if (input[i] == number) {
count++;
}
int[][] result = new int[count][];
int firstindex=0;
int lastindex=0;
for (int j=0; j<input.length; j++){
if (input[j]==number){
result[j]=Arrays.copyOfRange(input, firstindex, lastindex);
firstindex=lastindex=j;
}
lastindex++ ;
}
return result ;
}
также, я предполагаю, что у вас есть ошибка в строке result[j]=Arrays.copyOfRange(input, firstindex, lastindex);
. Возможно, что j
будет больше, чем count
(размер result
). Итак, у вас должен быть другой счетчик или указатель на последний свободный элемент в массиве result
(назначение для копирования следующего фрагмента массива).
UPDATE 3:
Ну, я не знаю, насколько справедливо это, но я сделал все ВАШЕ работу самостоятельно. Вот код, который на самом деле работает (с комментариями):
public static int[][] splitArrayByNum(int[] input, int number) {
if(input.length == 0) {
return new int[0][];
}
int count = 0;
for (int i = 0; i < input.length; i++) {
if (input[i] == number) {
count++;
}
}
if(input[input.length - 1] != number) {
/*we need to add the end of the array manually*/
count ++;
}
int[][] result = new int[count][];
int firstIndex = 0;
int iter = 0;
for (int j = 0; j < input.length; j++) {
if (input[j] == number) {
result[iter++] = Arrays.copyOfRange(input, firstIndex, j);
firstIndex = j+1;
}
}
if(input[input.length - 1] != number) {
/*manually adding the end of the array*/
result[count-1] = Arrays.copyOfRange(input, firstIndex, input.length);
}
return result;
}
я запустить его с помощью следующих нескольких строк, и это работает так же, как и ожидалось:
int[] inp = new int[]{1, 3, 3, 5};
int[][] sp = splitArrayByNum(inp, 3);
for(int i=0;i<sp.length;i++) {
System.out.print(i + ": ");
for(int j=0;j<sp[i].length;j++) {
System.out.print(sp[i][j] + " ");
}
System.out.println();
}
Кроме того, в какой-то момент, у вас могут быть пустые части (после раскола). Поэтому я оставляю это для вас, чтобы очистить его (они могут появляться повсюду (не только в начале или в конце), если в массиве input
есть два последовательных сплит-числа).
Вы также получите предупреждение о компиляторе: «Мертвый код» для 'i ++' в последнем цикле for, используя переменную 'i':' for (int i = 0; i
Seelenvirtuose