黑马程序员技术交流社区

标题: ArrayIndexOutOfBoundsException: 7出现这个但是我找不到原因 [打印本页]

作者: 冷风    时间: 2014-8-5 10:24
标题: ArrayIndexOutOfBoundsException: 7出现这个但是我找不到原因
本帖最后由 冷风 于 2014-8-5 11:17 编辑

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 7
        at ArrZhaoShu.getIndex(ArrZhaoShu.java:28)
        at ArrZhaoShu.main(ArrZhaoShu.java:6)

        public static void main(String[] args)
        {
                int[] arr ={1,3,5,7,9,11,13};
                int index=getIndex(arr,5);
                System.out.println("index="+index);
        }
          public static int getIndex(int [] arr,int key)
        {
             int min, max, mid;
                        min=0;
                        max=arr.length;
                        mid=(min+max)/2;


                        while (arr[mid]!=key)//这是第28行
                        {
                                if(key<arr[mid])
                                        min=mid+1;
                                else if(key>arr[mid])
                                        max=mid-1;

                                if(min>max)
                                        return -1;
                                mid=(min+max)/2;
                        }
                        return mid;
        }
   我看了半天我也没找到我到底是那写错了:'(
作者: fantacyleo    时间: 2014-8-5 10:35
越界问题:把max=arr.length 改成 max=arr.length - 1;
逻辑问题:while部分完全写反了。key都比arr[mid]小了,你还到数组后半部分去找,可能找到吗?先把老毕写的源码消化好了再自己写,写好了也先对照一下老毕的源码
作者: 冷风    时间: 2014-8-5 10:41
fantacyleo 发表于 2014-8-5 10:35
越界问题:把max=arr.length 改成 max=arr.length - 1;
逻辑问题:while部分完全写反了。key都比arr[mid]小 ...

谢谢你:hug:
:'(  原来在着,我反复看了几遍都没看到:dizzy:
作者: 冷风    时间: 2014-8-5 10:43
fantacyleo 发表于 2014-8-5 10:35
越界问题:把max=arr.length 改成 max=arr.length - 1;
逻辑问题:while部分完全写反了。key都比arr[mid]小 ...

嗯,谢谢:hug:
作者: 冷风    时间: 2014-8-5 10:45
[/quote]
[quote]逻辑问题:while部分完全写反了。key都比arr[mid]小了,你还到数组后半部分去找,可能找到吗?先把老毕写的源码消化好了再自己写,写好了也先对照一下老毕的源码

这也错了吗,我可以输出结果了呀
作者: masai158    时间: 2014-8-5 10:56
本帖最后由 masai158 于 2014-8-5 10:58 编辑

等会儿。仔细看一下
作者: fantacyleo    时间: 2014-8-5 10:57
冷风 发表于 2014-8-5 10:45
这也错了吗,我可以输出结果了呀

你没发现结果是错的吗?5明明在你的数组里,但却说找不到,输出了-1
作者: 冷风    时间: 2014-8-5 11:03
fantacyleo 发表于 2014-8-5 10:57
你没发现结果是错的吗?5明明在你的数组里,但却说找不到,输出了-1

:funk:我还真没注意到,我是说我刚刚用另个方法总是出现-1咯。
:lol受教了,谢谢你。
作者: 冷风    时间: 2014-8-5 11:04
masai158 发表于 2014-8-5 10:56
等会儿。仔细看一下


虽然我现在知道了,但是还是谢谢你。
:hug:
作者: diaolinan    时间: 2014-8-5 11:08
//max值应设为arr.length-1;  不要越界
//查询的数组这里应该为有序的,若为无序则应该先进行排序
//查找时max、与min值得设定要注意
class ArrayExceptionDemo
{
        public static void main(String[] args)
        {
                int[] arr= {1,3,5,7,11,13};
                int index = ArrayDemo(arr,7);
                System.out.println("查询坐标----index------"+index);
        }

        public static int ArrayDemo(int[] arr,int key)
        {
         int min,max,mid;
                 min = 0;
                 max = arr.length-1;
                 mid = (min+max)/2;
                 while(arr[mid]!= key && min<max)
                 {
                        if(key<arr[mid])
                        {
                                max = mid-1;
                        }
                        else if(key>arr[mid])
                                min = mid+1;
                        mid = (min+max)/2;
                 }

                 return mid;


        }
}

作者: masai158    时间: 2014-8-5 11:17
本帖最后由 masai158 于 2014-8-5 11:23 编辑
冷风 发表于 2014-8-5 11:04

虽然我现在知道了,但是还是谢谢你。

public static void main(String[] args)
        {
                int[] arr ={1,3,5,7,9,11,13};
                int arrIndex = getIndex(arr,2);
                System.out.println(arrIndex);
        }
        
        public static int getIndex(int[] arr,int key)
        {
                int start = 0;
                int end = arr.length-1;
                int mid = (start+end)/2;
                while(min <= end )
                {
                        mid = (start+end)/2;
                        if(arr[mid]>key)
                                end = mid-1;
                        else if(arr[mid]<key)
                                start = mid +1;
                        else if(arr[mid]==key)
                                return mid;
                        else
                                return -1;
                }
                return -1;
        }


{:2_31:}我是不是来晚了?
作者: 冷风    时间: 2014-8-5 11:21
masai158 发表于 2014-8-5 11:17
public static void main(String[] args)
        {
                int[] arr ={1,3,5,7,9,11,13};

:lol 是的,
人家都发了好久了,开始看到你发了一个怎么被你改了{:2_35:}
是不是有问题在里面:lol
作者: masai158    时间: 2014-8-5 11:22
{:2_34:}  bei 你发现了。最后一个 判断条件 开始是  start 测试没问题。然后 看他们mid ,我又测试好像没有问题。。{:2_31:} 我是复习知识的
作者: 怀念黑海岸    时间: 2014-8-5 11:23
在对数组进行变量时需要注意数组最后一个角标的规范,因为数组的数组下标是从0开始的,而用获取数组的长度方法返回的是数组的长度,计算长度是从1开始的,所以在这儿如果我们不小心遍历到第length个角标的时候就会抛出数组越界异常。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2