您好我是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));
我知道这是一个微不足道的概念,任何形式的帮助都是值得赞赏的
答案 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。
尝试一下,让我知道它是否适合你。