【问题标题】:How do I selectively remove values from my arraylist based on a condition?如何根据条件有选择地从我的数组列表中删除值?
【发布时间】:2016-04-07 06:02:25
【问题描述】:

我已经看到here 的答案,但我不确定它是否能回答我的问题。所以我有一个浮点类型的数组列表,其中包含一堆数字。我希望删除所有比前一个值多或少 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);
        }
    }

【问题讨论】:

  • 也许你的意思是if(y&gt;(x+30.0f)||y&lt;(x-30.0f))。虽然不清楚如果列表是 10 50 90 你想做什么。你是只删除 50,还是应该删除 90?
  • 问题是,我正在存储心率值,如果 HR(n+1) 为 30+HR,我将删除它,因为它可能不是正确的值。在您的示例中,例如,将删除 50 和 90,因为我的基线是 10。
  • 在这种情况下,请遵循@Eran 的建议,但也要在if 语句中(在remove() 之后)执行i--,以防止在此迭代中推进,您删除以下元素。
  • 好的,这个呢? stackoverflow.com/questions/1196586/… 它说我必须使用“迭代器”。但在这种情况下,我的 for 循环本身就是在迭代,不是吗?

标签: java android arraylist


【解决方案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,这看起来不是一个好的行为。也许您应该计算平均值并删除远离平均值的元素。

【讨论】:

    【解决方案2】:

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

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

    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)),或者仅删除代码中以“//”结尾的行样本

    【讨论】:

      【解决方案3】:

      请看下面的代码

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 1970-01-01
        • 1970-01-01
        • 2017-09-21
        • 2021-03-19
        • 2020-10-29
        • 1970-01-01
        相关资源
        最近更新 更多