方法根本不返回任何内容

时间:2014-11-19 09:59:32

标签: java arrays methods error-handling delimiter

我写了一个方法,它将一个数字和一个整数(它将是分隔符)作为输入,该方法将返回一个根据不包括分隔符的分隔符切片的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 ;
}

1 个答案:

答案 0 :(得分:1)

这是因为在{for-loop范围中定义了result

请格式化您的代码,您会看到result在返回语句中不“可见”。

更新: 友好的余数:您可以使用快捷键格式化 eclipse 中的所选代码: Ctrl + Shift + 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范围内定义,并从那里返回,但我相信您要返回 for循环之后的 ,不是吗?

我认为您的代码应如下所示:

result

另外,我猜您在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);可能会大于jcount的大小)。所以,你应该有另一个计数器或指向result数组中最后一个空闲元素的指针(目标是复制下一个数组)。

更新3:

嗯,我不知道它有多公平,但我自己做了所有你的工作。 这是代码,它实际上有效(带注释):

result

我使用接下来的几行来运行它,这就像预期的那样:

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(); } 数组中有两个连续的分割数字,它们可能出现在任何地方(不仅在开头或结尾)。