循环内变量反问权限的问题

shadowing_fly 2007-10-25 10:32:35
import java.util.*;
public class SortInt {

public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入INT个数");
int length=sc.nextInt();

List<Integer> list=new ArrayList<Integer>();

int data;
for(int i=0;i<length;i++)
{
System.out.println("请输入数据:");
data=sc.nextInt();
list.add(data);
}
int result=0;
for(int o=0;o<length-1;o++){

int a=list.get(0);

for(int i=0;i<length-2;i++)
{


if(a>list.get(i+1)){
result=a;
}
else
{
result=list.get(i+1);
}
a=result;//这里好像跳出了循环

}


int index=list.indexOf((Object)new Integer(result));
list.remove(index);
System.out.println(result);


}
System.out.println(list.get(0));
}
}
...全文
111 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
shadowing_fly 2007-10-26
  • 打赏
  • 举报
回复
恩。。谢谢LS的这个我后来也发现了所以写了length=length-1嘛...可是循环内操作length好像也会改变循环次数...导致后几个数读不出来..我试了好久才搞明白定义了一个length2...本人菜鸟说得不对请指教
qybao 2007-10-26
  • 打赏
  • 举报
回复
低级错误,都不知该怎么解释好
首先3个变量的时候,length=3,开始list里有3个元素
for(int o=0;o <length-1;o++){leng-1=2,这里要循环o=0, o=1两次,我们把这里叫作大循环
第一次大循环
走到这里for(int i=0;i <length-2;i++) length-2=1,这里有循环一次,也就是只循环i=0的一次,我们把这里叫作小循环
小循环走一次,得到result,然后小循环结束,走到
int index=list.indexOf((Object)new Integer(result));
list.remove(index); //这个是关键,LZ先看清楚
System.out.println(result);
这样第一次大循环结束,此时list里还有2个元素

第二次大循环
走到小循环,小循环走一次,得到result,然后小循环结束,走到
int index=list.indexOf((Object)new Integer(result));
list.remove(index); //这个是关键,LZ先看清楚
System.out.println(result);
这样第二次大循环结束,此时list里还有1个元素

大循环全部结束,走到System.out.println(list.get(0));
此时list里还有元素,所以list.get(0)能取到数据,于是程序正常结束

好,现在来看length=4的时候,开始list里有4个元素
for(int o=0;o <length-1;o++){leng-1=2,这里要循环o=0, o=1, o=2三次,我们把这里叫作大循环
第一次大循环
走到这里for(int i=0;i <length-2;i++) length-2=2,这里有循环两次,即i=0, i=1,我们把这里叫作小循环,i=1是关键,LZ请注意
小循环正常结束,得到一个result,然后走到
int index=list.indexOf((Object)new Integer(result));
list.remove(index); //这个是关键,LZ先看清楚
System.out.println(result);
这样第一次大循环结束,此时list里还有3个元素

第二次大循环
走到小循环,小循环正常结束,得到result,然后走到
int index=list.indexOf((Object)new Integer(result));
list.remove(index); //这个是关键,LZ先看清楚
System.out.println(result);
这样第二次大循环结束,此时list里还有2个元素


第三次大循环
走到小循环,关键的地方来了
第一次小循环,i=0,i+1=1,list里还有两个元素,
list.get(i+1)就是list.get(1),list并没有越界,于是第一次小循环正常结束
接着第二小循环,i=1, i+1=2, list里还有两个元素
而此时list.get(i+1)就是list.get(2), 可见这里list越界了
list.get(2)是取第三个元素,而list本身只有2元素,所以就产生异常了




在固定循环中,删除类似于list这样的集合元素,一定要特别注意越界的问题
最简单的测试方法
List<String> list = new ArrayList<String>();
for (int i=0; i<3; i++) {
list.add(""+i); //这里增加元素,list有3个元素
}

for (int i=0; i<list.length; i++) {
list.remove(i); //这里是删除元素,这里就会发生越界异常,LZ自己分析吧,弄清楚这里,你就弄清楚你的问题了
}





shadowing_fly 2007-10-26
  • 打赏
  • 举报
回复
import java.util.Scanner;
public class SortInt {

public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.println("请输入INT个数");
int length=sc.nextInt();

List<Integer> list=new ArrayList<Integer>();

int data;
for(int i=0;i<length;i++)
{
System.out.println("请输入数据:");
data=sc.nextInt();
list.add(data);
}
int result=0;
int length2=length;
for(int o=0;o<(length-1);o++){

int a=list.get(0);
//int length2=length;

for(int i=0;i<length2-1;i++)
{
//int a=list.get(0);

if(a>list.get(i+1)){
result=a;
}
else
{
result=list.get(i+1);
}
//a=result;
//System.out.println(result);
a=result;

}


int index=list.indexOf((Object)new Integer(result));
Integer in= list.remove(index);
System.out.println(in);
length2=length2-1;
}
System.out.println(list.get(0));
}
}

shadowing_fly 2007-10-26
  • 打赏
  • 举报
回复
已经解决了...原来循环内操作控制循环个数的变量会引起循环次数变换...
shadowing_fly 2007-10-25
  • 打赏
  • 举报
回复
各位大虾看看这个程序错在哪里为什么3个变量就能运行4个就报错而且循环里只比较了第1和第2个...

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧