import java.util.*;
import java.lang.*;
public class Nk {
public static void main(String[] arys){
//建立随机ArrayList
Random count=new Random();
ArrayList ta=new ArrayList();
//产生随机数并按条件导入
for(int i=0;i<=19;i++)
{
int a=count.nextInt(10);
ta.add(i,a);

//将随机产生的5,4,1,分别删除,用另外随机数替代,用10替代  switch(Integer.parseInt(ta.get(i).toString()))
{
case '5':
ta.remove(i);
break;
case '4':
ta.set(i,count.nextInt(10));
break;
case '1':
ta.set(i, 10);
break;
}
}

//建立迭代器,遍历输入
Iterator it=ta.iterator();
while(it.hasNext())
{
System.out.println("随机的数据是:"+it.next());
}
}}红色部分无法实现,求解释(小弟不才,刚入门)

解决方案 »

  1.   

    此程序存在两个主要问题:
    1. 红色部分(也就是switch case部分)不能执行,是因为在switch条件中,你打算用int型,但在case中加了单引号,应该把单引号去掉。直接使用int型。2.  在 case 为 5 的情况下,有remove操作,在循环到前面的 ta.add(i,a) 语句的时候,“彼时”的i已不是“此时”的i,会抛出 java.lang.IndexOutOfBoundsException 异常
      

  2.   

    先谢了。
    的确如你所说 会抛出java.lang.IndexOutOfBoundsException 异常,而且断点确定了位置就是remove(i)
    但是我不明白为何remove(i)时不行 set(i,10)时就行,不是同一个i没有明白啊  我是在for里面执行switch 为何不是同一个i?难道是remove()这个方法的问题?
      

  3.   

    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.Random;public class Nk {
    // 建立随机ArrayList
    ArrayList<Integer> ta = new ArrayList<Integer>();
    Random count = new Random();
    int randNum; //随机数总数

    public Nk(int randNum){
    this.randNum = randNum;
    }

    public void generateRndNums(){
    int i = 0;
    while(i < randNum){
    ta.add(i, getDesignatedRandNum());
    i++;
    }

    //遍历结果
    Iterator it = ta.iterator();
    while(it.hasNext()){
    System.out.println(it.next());
    }
    }

    private int getDesignatedRandNum(){
    int a = count.nextInt(10);

    //若为5,4,1,则重新生成随机数
    if(a == 5 || a == 4 || a == 1){
    a = getDesignatedRandNum();
    }

    return a;
    }

    public static void main(String[] arys) {
    Nk nk = new Nk(19);
    nk.generateRndNums();
    }
    }
      

  4.   

    你remove后 整个集合的结果和内部包含的对象数量已经变了这时再按之前的size循环当然有问题  必须用循环嵌套的方式
      

  5.   

    这个代码不能实现的原因是:
    1.case '4':
    ta.set(i,count.nextInt(10));
    也可能是1,4,5
    2.因为前面有删除处理,所以ta.set(i, 10);
    根本就不是对表的最后一个元素进行操作估计上面的对你有点帮助
      

  6.   

    其实上4 5 的情况应该是一样的,都可以是,直接删了,取下一条满足情况的结果。
    case不要用char, 改用int
    package aa;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.Random;public class Test2 {
    public static void main(String[] arys) { Random count = new Random();
    ArrayList ta = new ArrayList(); do {
    int a = count.nextInt(10);
    switch (a) {
    case 5:
    break;
    case 4:
    break;
    case 1:
    ta.add(10);
    break;
    default:ta.add(a);
    } System.out.println(a); } while (ta.size() <= 19); Iterator it = ta.iterator();
    while (it.hasNext()) {
    System.out.println("the random data is:" + it.next());
    }
    }}
      

  7.   

    ArrayList<Integer> ta=new ArrayList<Integer>();switch(ta.get(i))
    {
    case 5:
    ta.remove(i);
    break;
    case 4:
    ta.set(i,count.nextInt(10));
    break;
    case 1:
    ta.set(i, 10);
    break;
    }
    }
      

  8.   

    ArrayList不加泛型,LZ还停留在JDK1.4?
      

  9.   

    根本原因以找到 举个例子
    i:1,2,3,4,5,6,7。
    i对应的值是j
    j:6,3,2,5,6,9,7。。(随机产生)
    如果i4 对应的是5 通过remove()删除掉 i4就会变成空  也就是本来应该i5的值 会存放到i4里 所以会产生异常 出现错我
    谢谢各位