A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 冷风 于 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;
        }
   我看了半天我也没找到我到底是那写错了:'(

13 个回复

倒序浏览
越界问题:把max=arr.length 改成 max=arr.length - 1;
逻辑问题:while部分完全写反了。key都比arr[mid]小了,你还到数组后半部分去找,可能找到吗?先把老毕写的源码消化好了再自己写,写好了也先对照一下老毕的源码
回复 使用道具 举报
fantacyleo 发表于 2014-8-5 10:35
越界问题:把max=arr.length 改成 max=arr.length - 1;
逻辑问题:while部分完全写反了。key都比arr[mid]小 ...

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

嗯,谢谢:hug:
回复 使用道具 举报
[/quote]
[quote]逻辑问题:while部分完全写反了。key都比arr[mid]小了,你还到数组后半部分去找,可能找到吗?先把老毕写的源码消化好了再自己写,写好了也先对照一下老毕的源码

这也错了吗,我可以输出结果了呀
回复 使用道具 举报
本帖最后由 masai158 于 2014-8-5 10:58 编辑

等会儿。仔细看一下
回复 使用道具 举报
冷风 发表于 2014-8-5 10:45
这也错了吗,我可以输出结果了呀

你没发现结果是错的吗?5明明在你的数组里,但却说找不到,输出了-1
回复 使用道具 举报
fantacyleo 发表于 2014-8-5 10:57
你没发现结果是错的吗?5明明在你的数组里,但却说找不到,输出了-1

:funk:我还真没注意到,我是说我刚刚用另个方法总是出现-1咯。
:lol受教了,谢谢你。
回复 使用道具 举报
masai158 发表于 2014-8-5 10:56
等会儿。仔细看一下


虽然我现在知道了,但是还是谢谢你。
:hug:
回复 使用道具 举报
//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: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:}我是不是来晚了?
回复 使用道具 举报
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
回复 使用道具 举报
{:2_34:}  bei 你发现了。最后一个 判断条件 开始是  start 测试没问题。然后 看他们mid ,我又测试好像没有问题。。{:2_31:} 我是复习知识的
回复 使用道具 举报
在对数组进行变量时需要注意数组最后一个角标的规范,因为数组的数组下标是从0开始的,而用获取数组的长度方法返回的是数组的长度,计算长度是从1开始的,所以在这儿如果我们不小心遍历到第length个角标的时候就会抛出数组越界异常。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马