传递给函数时Java中的数组Funkiness

时间:2014-11-19 04:03:02

标签: java arrays

当我在Java中将数组作为函数参数传递时,请说:

public static void main(String... args){
   int[] in=new int[]{57,40...23};
   int[] post=new int[]{50,18...0};//arrays abbreviated for expediency
   treeNode tree=buildTree(in, post);
   print(tree);
}

public static treeNode buildTree(int[] in, int[] post)
{   
   int root_data= post[(post.length)-1];
   int root_index=search(root_data, in);
   treeNode root=new treeNode(root_data);
   root.setLeft(buildTree(subArray(in, 0, root_index),subArray(post, 0, root_index)));
   root.setRight(buildTree(subArray(in,root_index+1, in.length),     
                  subArray(post,root_index, post.length-1)));
   return root;
}

public static int[] subArray(int[] array, int start, int end)
{
    int[] result=new int[end-start];
    for(int i=0; i<end-start;i++)
    {
        result[i]=array[start+i];
    }
    return result;
}

public static int search(int key, int[] array)
{
  for(int i=0; i<array.length; i++){
      if(array[i]==key)
          return key;
  }
  return array.length;
}

我收到arrayIndexOutOfBounds个例外。通过调试器,我神秘地发现数组变为长度为0.这是为什么?

1 个答案:

答案 0 :(得分:1)

search()方法中,您可能希望返回i而不是key。由于您稍后使用root_index变量(使用此函数找到)作为数组索引,因此可能会遇到麻烦(arrayIndexOutOfBounds异常抛出)。即使root_index在数组索引的范围内,它的值仍然是错误的 - 确切地说,它在您的示例中是0,而subArray()方法返回空数组。

您可能需要考虑使用标准工具而不是自己的方法:

  • Arrays.sort()后跟Arrays.binarySearch()进行搜索:即使渐渐地比你的简单搜索更糟糕 - O(n * lon(n))要排序加O(log(n) )在你的情况下二进制搜索与O(n) - 考虑到你可能有小数组这仍然是合理的,但你得到了保证算法的正确性
  • Arrays.copyOfRange()复制数组范围

另外,我没有看到treeNode类的任何定义,但为了简洁起见,我猜你在发布的代码中省略了它。

关于样式的快速说明:在Java中,使用camelCase调用变量和方法(因此您可能希望将root_index重命名为rootIndex,依此类推)并且类从上层开始 - 大小写字母(所以treeNode最好命名为TreeNode)。它可以使您的代码在阅读时更加(直观)易于理解。

希望有所帮助!