检查并在arraylist中添加浮点值

时间:2016-04-07 13:40:18

标签: java arraylist

您好我是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));

我知道这是一个微不足道的概念,任何形式的帮助都是值得赞赏的

4 个答案:

答案 0 :(得分:2)

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

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);
    }
  }
}

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

答案 1 :(得分:0)

考虑如果 dummyList 为空,当j为0时,它会将 theList 中的一个元素添加到它,但是当j为1时,您试图设置元素位置1来自 dummyList 。但在那一刻, dummyList 只有一个元素,位于0位。这就是你得到错误的原因。

一种解决方案是确保您使用初始容量(或大小,如果您愿意)创建 dummyList 作为 theList 的大小。

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

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

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

}

答案 2 :(得分:0)

您还没有考虑到如果dummyValues中只有1个元素,它将通过dummyValues.size()==0),但由于ArrayList从0开始计数,因此只会有一个0的索引。因此,如果我们在theList的索引1处,则会引发相关异常。

您可能需要为dummyValues.size()==1)添加另一个条件:()

答案 3 :(得分:0)

  • 确保变量并初始化。

    ...
  • 然后你可以在代码中做任何事情之前进行检查 -

    dummyValues = new ArrayList<Float> ();
    

这将检查 public void generateValues(ArrayList<Float> theList) { if (theList.size() > 0) { for (int j = 0; j < theList.size(); j++) { if (dummyValues.size() == 0) { dummyValues.add(theList.get(j)); } else { try { if (dummyValues.get(j) != null) { dummyValues.set(j, theList.get(j)); } } catch (IndexOutOfBoundsException e) { //no element present here . } } } } } 是否有任何值,然后开始循环。如果theList为空,则添加第0个元素或继续使用theList值替换dummyValues。

尝试一下,让我知道它是否适合你。