【问题标题】:Get all strings that occur in ALL given lists获取所有给定列表中出现的所有字符串
【发布时间】:2018-01-22 15:19:46
【问题描述】:

我有一个列表列表:ArrayList<ArrayList<String>> names
我想获取每个列表中出现的所有字符串的列表。有没有更简单、更优雅的方法来代替使用 4 个循环:

ArrayList<ArrayList<String>> names = new ArrayList<>();
for (ArrayList<String> n1 : names) {
    for (String name1 : n1) {
        for (ArrayList<String> n2 : names) {
            for (String name2 : n2) {
            }
        }
    }
}

编辑:

我想要一个出现在所有列表中的字符串列表。因此,如果一个字符串只在其中一个或两个列表中,它就不应该在我的结果列表中。

是的,代码必须与 Java 7 兼容,所以遗憾的是没有流。

【问题讨论】:

  • 是否要将列表列表拼合为一个列表?是否也想避免重复元素?
  • 您已标记 Java-7 - 因此我假设您不想要 stream?
  • 你想要列表的交集吗?
  • 可以选择 java 8(您将问题标记为 java-7)吗?
  • 通过阅读您的问题根本不清楚您是想要列表的交集还是并集。请澄清

标签: java string arraylist java-7


【解决方案1】:

您可以在 Java 7 上获得 ArrayList.retainAll 的帮助。例如,在 ArrayList&lt;ArrayList&lt;String&gt;&gt; names 中有此列表:

list1 = "e1", "e2", "e3", "e4", "e5"
list2 = "e6", "e7", "e3", "e4", "e5"
list3 = "e8", "e9", "e3", "e4", "e5"

您可以使用retainAll 获取每个列表(交集)中出现的所有字符串:

List<String> commonElements = new ArrayList<>(list1);
for(List<String> tmpList: names){
    commonElements.retainAll(tmpList);
}

输出:

[e3, e4, e5]

【讨论】:

  • 虽然 OP 目前忽略了澄清它是联合还是交集;这看起来很可能是他们想要的。
【解决方案2】:

您可以将多个列表展平为一个字符串列表

Java 7:

List<String> flattenedResult = new ArrayList<>();
for (List<String> currentNameList : names) {
    flattenedResult.addAll(currentNameList);
}

使用 Java 8 流:

List<String> flattenedResult = names.stream()
        .flatMap(Collection::stream)
        .collect(Collectors.toList());

【讨论】:

    猜你喜欢
    • 2012-09-14
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多