【问题标题】:How to get all rows from ArrayList<ArrayList<String>> having specific value in specific column?如何从 ArrayList<ArrayList<String>> 中获取在特定列中具有特定值的所有行?
【发布时间】:2018-11-06 06:01:57
【问题描述】:
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? 可能会提供一些额外的背景信息。

【问题讨论】:

  • 你进一步尝试了什么?
  • 行是什么意思?用最少的例子提供一些输入和输出
  • IntStream.range(0, list.size()) .filter(i -&gt; list.get(i).get(0).equals("A")) .boxed() .collect(Collectors.toList());
  • 您声明您希望所有行都带有“"A" in first columns”。您的意思是“列”还是“列”(即您是只查找第一列还是多列)?您还声明结果应该是“仅第一行和第二行”,但这些行在第一列中没有 "A"。第一行和第三行的第一列有"A"。第二行甚至没有"A"。然后,您声明“答案应该适用于任何列和任何列的值”。这是否意味着您需要人们编写一个同时接受匹配列和匹配值的函数?
  • 我已编辑问题以澄清我在上面评论过的问题。鉴于您已接受答案,编辑反映您的意图反映在该答案中。如果您确实想要不同的东西,请查看并恢复编辑。

标签: java list java-8 java-stream


【解决方案1】:

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

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

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

打印List&lt;List&lt;String&gt;&gt; rows时的输出

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

[A、B、C、R]

[A、B、C、D]

【讨论】:

  • 请确保您编辑问题以增加价值,而不是删除相关的背景。或多或少,没有关于 OP 尝试了什么的详细信息,并且您还从先前的尝试中进一步删除了链接。既然你已经接受了这样的要求,那就leads to another,恕我直言,这可能只是一个剧透。
  • @nullpointer :我已将其删除,因为这是一个完全不同的问题,除了这两个问题都与 List 有关的事实之外,两者之间没有任何关系>。此外,另一个问题的尝试如何与新问题相关?
  • @nullpointer 你说的太对了.. 当我没有尝试回答这样的问题时,我被无情地否决了.. 为社区支持这个问题和这个答案感到难过
【解决方案2】:

如果我正确理解您的要求,您就不需要流。 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) 构造函数复制列表,然后在副本上使用上述内容。

【讨论】:

  • @nullpointer 您引用的要求自相矛盾。我尽力解释。我可能没有按预期解释。一个牵强的理由可能是结果包括第一行,从 1 开始,第二行,从 0 开始。我不想做所有的功课,所以让提问者为其他指标和值做这项工作,尽管我相信我已经提供了一个或两个有用的提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 2018-05-26
  • 1970-01-01
相关资源
最近更新 更多