ArrayList

时间:2017-03-25 22:44:29

标签: java loops arraylist

我在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()

1 个答案:

答案 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));