在Java中检查ArrayList元素(从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

我读取了一个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, -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;
            }
        });