我已经看到答案为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);
}
}
答案 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);
}