如何从ArrayList <arraylist <string >>中获取在特定列中具有特定值的所有行?

时间:2018-11-06 06:01:57

标签: java list java-8 java-stream

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

public class Delete
{
    public static void main(String[] args)
    {
         List<List<String>> list = new ArrayList<>();
         list.add(List.of("A","B","C","R"));
         list.add(List.of("E","F","G","F"));
         list.add(List.of("A","B","C","D"));
    }
}

我想获得第一列中所有具有"A"的行。在上面的示例list中,结果应仅位于第一行和第三行:

["A", "B", "C", "R"]
["A", "B", "C", "D"]

我更喜欢使用Java 8 stream的解决方案。

我的另一个问题How to find unique value of a column of a 2D ArrayList in java?可能会提供其他一些背景信息。

2 个答案:

答案 0 :(得分:2)

您可以简单地使用以下内容:

List<List<String>> rows = list.stream()
                              .filter(l -> l.get(0).contains("A"))
                              .collect(Collectors.toList());

在这里,我们检查列表的第一个索引是否包含“ A”,然后将结果流收集到列表中。

打印List<List<String>> rows

时的输出
rows.forEach(System.out::println);
  

[A,B,C,R]

     

[A,B,C,D]

答案 1 :(得分:1)

如果我正确理解您的要求,则不需要信息流。 List.removeIf方法被忽略了并且非常有用:

     list.removeIf(inner -> inner.size() <= 0 || ! inner.get(0).equals("A"));

对于另一个索引(例如3),您将需要用0替换两个出现的3。您可能希望将整个内容包装在一个方法中。请注意,这会修改原始列表。让我们转储修改后的列表以查看结果:

     list.forEach(System.out::println);

此打印:

[A, B, C, R]
[A, B, C, D]

如果您希望将结果显示在新列表中,则可以使用流,也可以使用ArrayList(Collection)构造函数简单地复制列表,然后在副本上使用以上内容。