我在java中有一个名为ArrayList
的{{1}},它包含另一个名为ind
的ArrayList的索引。我想要做的是将每个ind项与下面的项进行比较,看看差异是否低于数字data
。如果差异较大,请转到下一个项目。
如果较低,请删除mpd
最低的索引。
基本上,我试图找到最高峰。
我的第一个方法是:
data.get(index)
我知道这不是从列表中删除项目的最佳方法,但这首先完成了这项工作。
但我知道必须有一个更好的方法来做到这一点。 所以经过一番尝试,我得到了这个:
for(int i = 0; i<ind.size()-1; i++) {
if (ind.get(i) != -1) {
for (int j = i + 1; j < ind.size(); j++) {
if ((ind.get(j) - ind.get(i)) <= mpd) {
if (x.get(ind.get(i)) >= x.get(ind.get(j))) {
ind.set(j, -1);
} else {
ind.set(i, -1);
break;
}
} else {
break;
}
}
}
}
ind.removeAll(Collections.singleton(-1));
这是伟大的,但当然,对于最后的比较,它是超出界限的。并且它不会进行比较以删除最高的元素
ind.removeIf(indices -> ((ind.get(indices+1) - ind.get(indices)) <= mpd));
有没有什么方法可以比较列表中的项目及其成功者,然后将其值放在另一个列表中并不意味着双循环? 非常感谢。
修改
在做了一些思考后,我不确定这是否可行,因为索引包含ind的值,所以如果我(x.get(ind) vs x.get(ind+1))
它只会加1,但不会得到下一个值,而我不能做indices.next()
答案 0 :(得分:0)
你可以检查你是否仍然在界限
ind.removeIf(indices -> (indices + 1 < ind.size() && (ind.get(indices) - ind.get(indices + 1)) <= mpd));
您无法真正使用removeIf,因为它只能删除您正在迭代的当前索引,并且您需要将其与所有其他索引进行比较(在原始代码中,比较可能会导致删除当前节点或你正在比较它)。出于同样的原因,ListIterator也没有帮助。你可以删除内部for循环:
Integer lastInd = null;
Integer lastData = null;
for(int i = 0; i<ind.size(); i++) {
// New peak value with no removal
if (i == 0 || ind.get(i) - lastData > mpd) {
lastInd = i;
lastData = ind.get(i);
continue;
}
// Remove the lower value, if lower value was lastData switch to
// make this value the new lastData for comparison
if (x.get(lastData) >= x.get(ind.get(i))) {
ind.set(i, -1);
} else {
ind.set(lastInd, -1);
lastInd = i;
lastData = ind.get(i);
}
}
ind.removeAll(Collections.singleton(-1));