【问题标题】:How iterate an ArrayList inside various others ArrayLists?如何在其他各种 ArrayList 中迭代 ArrayList?
【发布时间】:2021-10-19 14:23:00
【问题描述】:

我被告知可以在其他人中创建“无限”ArrayLists,例如在下面的代码中:

import java.util.ArrayList;

public class Main
{
    public static void main(String[] args) {
        ArrayList<ArrayList<ArrayList<ArrayList<ArrayList<Object>>>>> List = new ArrayList<ArrayList<ArrayList<ArrayList<ArrayList<Object>>>>>();
    }
}

我想知道如何迭代它们(使用 foreach 或其他循环类型)

【问题讨论】:

  • Java 的类型系统不喜欢你做这样的事情。在任何情况下,遍历任意深度嵌套列表的唯一实用方法是使用递归
  • 如果你有这样的数据结构,你做错了很多事情。是时候重新考虑一些决定了。除此之外,列表列表只是一个列表。所以你可以像任何其他列表一样迭代它。
  • 确实是在做本该更难的事情
  • 这太疯狂了。

标签: java loops for-loop arraylist


【解决方案1】:

您可以尝试像组合一样遍历它:

public static void traverse(ArrayList<T> arg) {
   arg.forEach(
    (n) -> if (n instanceof ArrayList) { 
        traverse(n)
      } else {
        doStomething(n)
      }
  );
}

【讨论】:

  • 谢谢!我会尝试理解它并用于解码循环。
  • 我正在搜索其他语言是怎么做的,您的回答与此非常相似:stackoverflow.com/questions/7106410/…
  • 是的,是同一个概念
【解决方案2】:

恕我直言,如果有人写了这样的结构 - 那就是某种疯子。 但是,您仍然可以按照这种模式进行遍历:

@Test
    public void test4() {
        List<String> list1 = new ArrayList<>();
        list1.add("abc");
        list1.add("def");

        List<List<String>> list2 = new ArrayList<>();
        list2.add(list1);

        list2.stream().flatMap(Collection::stream).forEach(System.out::println);
    }
```

【讨论】:

  • 有趣的答案,似乎比 Vulwsztyn 解决方案更简单,虽然他的答案更健壮,但我不太明白。
  • 这个组件做什么 :: ?
  • @UserOfStackOverFlow 这是在 lambda 中引用现有方法的简短方法。例如:'flatMap(Collection::stream)' 可以替换为 'flatMap(param -> param.stream())',这样可以让它看起来更长而无需任何必要。你可以在这里找到更详细的信息:baeldung.com/java-method-references
猜你喜欢
  • 2020-06-23
  • 2012-10-05
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 2015-11-13
相关资源
最近更新 更多