嗨,我是Java新手,正在尝试了解arraylist。我正在使用Arraylist theList和dummyValues。我从theList中读取值,并更新了dummyValues中的浮点值。我的代码段如下
`

     public static void generateValues(ArrayList<Float> theList) {

     for (int j = 0; j < theList.size(); j++) {
         if (dummyValues.size()==0)
                 dummyValues.add(j, theList.get(j));

          else
                dummyValues.set(j, theList.get(j));
                   }
}


我尝试在第一个条件中将值添加到ArrayList dummyValues中,如果第二个条件中的dummyValues大小大于0,则仅更新dummyValues的值。我已经考虑过这种方法以避免重复副本。

但是,当我执行它时,出现以下错误:


  java.lang.IndexOutOfBoundsException:无效的索引1,大小为1


错误出现在这里dummyValues.set(j, theList.get(j));

我知道这是一个琐碎的概念,任何帮助都值得赞赏

最佳答案

我建议这种改进。将您的方法更改为此:

public static void generateValues(ArrayList<Float> theList) {

 for (int j = 0; j < theList.size(); j++) {
     if (dummyValues.size()==0){
             dummyValues.add(j, theList.get(j));
       }
      else if(dummyValues.size()==theList.size()){
            dummyValues.set(j, theList.get(j));
               }
     else{
         dummyValues.add(theList.get(j));
    }
}


检查两个列表的大小,如果列表大小不同,它将向虚拟列表添加新元素,而不是尝试在不存在的索引上设置元素。
在这种情况下,列表可能不会具有相同的顺序。

编辑:这不是正确的答案!!!抱歉,我的写作速度比思考的快。 :(
仅在theList.size() > dummyValues.size()时有效。我会尽量提高我的回答;)

EDIT2:再次您好。
做了一些工作,我回来了。我重新设计了您的方法,并且以我认为更好的解决方案为您提供了第二个解决方案。检查一下:

public static void generateValues(List<Float> theList) {

  if (dummyValues.size() >= theList.size()) {
    for (float value : theList) {
      dummyValues.set(theList.indexOf(value), value);
    }
  }
  else {
    for (float value : theList) {
      dummyValues.add(dummyValues.size(), value);
    }
  }
}


尝试一下,让我知道它是否适合您的需求。

10-01 17:48