在Java中检查ArrayList元素(从csv文件提取)并使用所需逻辑对其进行解析时出错
我读取了一个CSV文件,如下所示在Java中检查ArrayList元素(从csv文件提取)并使用所需逻辑对其进行解析时出错,java,csv,arraylist,Java,Csv,Arraylist,我读取了一个CSV文件,如下所示 ,Tmt 1,Tmt 2,Tmt 3 delta 1,-104,-100,-103 delta 2,-125,-103,-103 delta 3,-104,-100,failed 后来,我解析了csv文件,并将其所有元素放入字符串的ArrayList中。 现在ArrayList看起来像 [Tmt 1, Tmt 2, Tmt 3, delta 1, -104, -100, -103, delta 2, -125, -103, -103, delta 3, -10
,Tmt 1,Tmt 2,Tmt 3
delta 1,-104,-100,-103
delta 2,-125,-103,-103
delta 3,-104,-100,failed
后来,我解析了csv文件,并将其所有元素放入字符串的ArrayList中。
现在ArrayList看起来像
[Tmt 1, Tmt 2, Tmt 3, delta 1, -104, -100, -103, delta 2, -125, -103, -103, delta 3, -104, -100, failed]
现在,我想删除字符串ArrayList(如上图所示)中以字母表开头的所有元素。我使用下面的代码来实现这一点。
(al1是我上面提到的ArrayList,temp是我用来检查al1元素的字符串)
(这不是我所期望的)
请帮忙。。提前感谢问题是您正在使用索引删除元素 当您删除一个元素时,您的
i
将关闭,第一次删除后,您将不会删除正确的元素
假设你的i
是5
并且你已经删除了该元素,在下一次迭代中,当i
是6
时,当你执行al1.get(i)
时,你将实际得到原始列表中的第7个元素,而不是第6个,因为你的第6个元素索引现在是5
,而不是6
。因此,您将根本无法访问该元素
(inti=0;i的,下面是发生的情况
列表是Tmt1,Tmt2,Tmt3,…
。开始时,元素0是Tmt1
我们把这个看作是移除,它是从一个字母开始的,所以我们移除它,然后移动到元素1(第二个元素)上。但是到那时我们已经删除了一个,所以列表OS现在Tmt2,Tmt3,…
,我们正在考虑列表中的第二个,它是Tmt3
!Tmt2
,永远不会被看到,因为它在列表向前移动的同时向后移动
处理这个问题的最好方法是Java 8 streams API,它允许您在列表上指定一个过滤器,并让它自动删除所有不符合过滤器要求的元素。它简洁易读,比for
循环容易得多。您可以使用内置的removeif
方法,如下所示:
al1.removeIf(new Predicate<String>() {
@Override
public boolean test(String t) {
if (t.charAt(0)=='-'|| (Character.isDigit(t.charAt(0))==false)){
return true;
}
return false;
}
});
al1.removeIf(新谓词(){
@凌驾
公共布尔测试(字符串t){
if(t.charAt(0)='-'| |(Character.isDigit(t.charAt(0))==false)){
返回true;
}
返回false;
}
});
那么,您期望得到什么,为什么?您是否通过调试器逐步解决了这一问题,并找出了哪里出了问题?您是否确定了问题是在使用列表还是字符串处理方面?请记住一件事:如果您从列表中删除了一个项目,其他所有项目都会重新排列……因此,您需要的下一个项目是什么要检查的索引将与刚才删除的索引相同。您可以通过在remove
调用之后添加i--
来修复此问题。或者您可以从列表的末尾一直到开始。或者您可以创建另一个只包含要保留的元素的列表。Jon Skeet,我希望生成的数组列表中没有以字母表开头的元素。removeIf()仅在Java 8之后才存在。那么为什么不使用lambda而不是匿名类呢?al1.removeIf(t->t.charAt(0)='-'-'| |!Character.isDigit(t.charAt(0))
。每次使用if(条件)返回true;否则返回false;
,您可以编写它返回条件;
[Tmt 2, delts 1, -100, delta 2, -103, delta 3, -100]
Iterator<> it = al1.iterator();
while(it.hasNext()){
temp = it.next();
if (temp.charAt(0)=='-'|| (Character.isDigit(temp.charAt(0))==false))
{
it.remove();
}
}
al1.removeIf(new Predicate<String>() {
@Override
public boolean test(String t) {
if (t.charAt(0)=='-'|| (Character.isDigit(t.charAt(0))==false)){
return true;
}
return false;
}
});