2014-11-19 2 views
1

Я написал метод, который получает в качестве ввода массив чисел и целое число (которое будет разделителем), метод вернет 2D-массив, который нарезается в соответствии с разделителем, не включая разделитель. Примеры:Метод ничего не возвращает

splitArrayNyNum([0, 0, 0, 3, 1, 1, 1], 3) -> [[0, 0, 0], [1, 1, 1]] 

splitArrayNyNum([1, 2, 3, 1, 2, 3, 1, 1, 2, 2, 3, 1], 3) -> [[1, 2], [1, 2], [1, 1, 2, 2], [1]] 

splitArrayNyNum([3 , 1 ,3 ,3], 3) -> [[1]] 

По какой-то причине, когда я двигаю мышь над именем метода я получаю ошибку, что моя функция должна возвращать int[][]

Это мой код:

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

Вы также получите предупреждение о компиляторе: «Мертвый код» для 'i ++' в последнем цикле for, используя переменную 'i':' for (int i = 0; i Seelenvirtuose

ответ

1

Это связано с тем, что 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 есть два последовательных сплит-числа).

+0

Да, мне нужно вернуть результат после цикла, я попытался добавить закрытие}, но потом я получил ошибку, результат которой не определен! – Tam211

+0

@ user3369309 Итак, вы должны перенести объявление 'result' над циклом for, а не' return' после цикла for. Возможно, вы просто не копировали эту закрывающуюся фигурную скобку в конце, а последовательность скобок правильная. –

+0

@ user3369309 Я обновил ответ. Пожалуйста, взгляните и дайте мне знать, если у вас остались вопросы. –

Смежные вопросы