如何根据条件有选择地从我的arraylist中删除值?

时间:2016-04-07 06:02:26

标签: java android arraylist

我已经看到答案为here,我不确定它是否能解决我的问题。所以我有一个包含一堆数字的Float类型的arraylist。我希望删除所有比前一个值多30或更少的数字。所以,我正在比较'n''n+1'并删除'n+1' if (n+1)>(30+n),反之亦然。我写了以下代码,但我的解决方案没有用。

for(int i = 0; i<hr_list.size()-1; i++)
    {
        Float x= hr_list.get(i);
        Float y = hr_list.get(i+1);

        if(y>(x+30.0f)||y<(x+30.0f))
        {
            hr_list.remove(i+1);
        }
    }

3 个答案:

答案 0 :(得分:1)

根据你的评论,我会做这样的事情:

for(int i = 0; i<hr_list.size()-1; i++)
{
    Float x= hr_list.get(i);
    Float y = hr_list.get(i+1);

    if(y>(x+30.0f)||y<(x-30.0f))
    {
        hr_list.remove(i+1);
        i--; // you want to compare the current i'th element against the
             // new (i+1)'th element in the next iteration
    }
}

当然,如果基线(第一个元素)本身是错误的,那么这将失败。例如,如果你有一个包含20 70 76 79 89 70的列表,这个循环将只剩下20,这看起来不是一个好的行为。也许您应该计算平均值并删除远离平均值的元素。

答案 1 :(得分:0)

您无法修改当前正在迭代的列表(完全有意义)。

正确的方法是建立一个列表,只保留与条件匹配的值

public List<Integer> filterList(List<Integer> list) {
    List<Integer> result = new ArrayList<Integer>();
    if (list.size() == 0) return l;
    int current = l.get(0);
    boolean filtered = false;
    for (int v : l) {
        if (Math.abs(v - current) < 30) {
            result.add(v);
        } else {                 //
            filtered = true;     //
        }
        current = v;            //
    }
    if (filtered) return result;
    else return l;
}

您可能希望进行递归调用以使最终列表与初始条件匹配(递归停止条件:myList.equals(filterList(myList)),或者只删除以&#39; //&结尾的行#39;在代码示例中

答案 2 :(得分:0)

请参阅以下代码

for(int i=1;i<list.size();i++){
    float c=list.get(i);
    float p=list.get(i-1);
    if( (Math.abs(c-p)>30)
        list.remove(i);
}