当前位置:网站首页>错误:排序与角标越界

错误:排序与角标越界

2022-07-06 09:18:00 非风之想

错误提示:
java.lang.ArrayIndexOutOfBoundsException: Index 8 out of bounds for length 8
java.lang.ArrayIndexOutOfBoundsException: Index -1 out of bounds for length 8
-1,8索引超出了数组索引(如果用i–,j–就可能出现-1角标越界)

代码如下:

public class StringTest_1
{
    
	public static void main(String[] args)
	{
    
		String[] arr={
    "abc","NBA","CBA","java","Hong","demo","qq","WX"};
		printArray(arr);     
		sortString(arr);
		printArray(arr);
		maopaoString(arr);
		printArray(arr);
	}
	//冒泡排序
	public static void maopaoString(String[] arr)
	{
    		
		for(int i=0;i<arr.length-1;i++)
			for(int j=0;j<arr.length-1-i;j++)
			{
    
				if(arr[j].compareTo(arr[j+1])>0)
					swap(arr,j,j+1);     //swap(arr,arr[j],arr[j+1]); 
			}
	}
	//选择排序
	public static void sortString(String[] arr)
	{
    
		for(int i=0;i<arr.length-1;i++)    
			for(int j=i+1;j<arr.length;j++)
			{
    
				if(arr[i].compareTo(arr[j])>0)
					swap(arr,i,j);//swap(arr,arr[i],arr[j]); 
			}
	}
	//互换元素
	public static void swap(String[] arr,int i,int j)
	{
    
		String temp=arr[i];
		arr[i]=arr[j];
		arr[j]=temp;
	}
	遍历并打印数组
	public static void printArray(String[] arr)
	{
    
		System.out.print("[");
		for(int i=0;i<arr.length;i++)
		{
    
			if(i!=arr.length-1)
				System.out.print(arr[i]+",");
			else
				System.out.println(arr[i]+"]");
		}
	}
}
	//选择排序:按索引顺序每次拿出一个元素与其之后的每个元素挨个比较
	public static void sortString(String[] arr)
	{
    
		for(int i=0;i<arr.length-1;i++)    
			for(int j=i+1;j<arr.length;j++)
			{
    
				if(arr[i].compareTo(arr[j])>0)
					swap(arr,i,j);//swap(arr,arr[i],arr[j]); 
			}
	}

  外循环:iarr.length-1,共arr.length-2次排序,也就是把0到倒数第二个元素每个都拿出来一次,并与其后面的元素比较当然这里是内循环的事了,因为最后一个元素之后没有元素,所以是0<arr.lengrh-1。arr[i]就是外循环每次拿出的元素。
  内循环:j到arr.length,每拿出来一个元素都要与其之后的元素比较,所以j=i+1,外循环每加一次,内循环比较的个数就少一个,依次类推,所以外循环拿出来的元素每次都会与最后一个比较,直到倒数第二个元素与最后一个元素比较,完成排序。
小心角标越界,如果拿arr[i]是最后一个元素,还与arr[j]比较就会越界

	//冒泡排序:每趟排出一个元素的位置,相邻索引比较
public static void maopaoString(String[] arr)
{
    		
	for(int i=0;i<arr.length-1;i++)
		for(int j=0;j<arr.length-1-i;j++)
		{
    
			if(arr[j].compareTo(arr[j+1])>0)
				swap(arr,j,j+1);     //swap(arr,arr[j],arr[j+1]); 
		}
}

  外循环:外循环控制总趟数,每趟排出一个元素,依次类推,当排剩下最后一个元素,没有与其比较的元素,所以就是arr.length-1躺排序

  内循环:内循环控制每趟排序,arr[j]与arr[j+1]比较,每两个相邻的元素都要比较一次,第一趟排完最大(或最小)的元素就会放到最后一个 位置arr.length,依次类推,最后一趟第一个元素arr[0]与第二个元素arr[1]比较,所以每趟比较的次数为arr.length-1-i次。

小心角标越界,如果拿arr[j]是最后一个元素,还与arr[j+1]比较就会越界
原网站

版权声明
本文为[非风之想]所创,转载请带上原文链接,感谢
https://blog.csdn.net/Hong66111/article/details/100041527