【问题标题】:From List of Set of String to a plain list从字符串集列表到普通列表
【发布时间】:2019-04-02 11:01:05
【问题描述】:

有没有一种方法可以将 List<Set<String>> mainList 转换为普通列表,而无需遍历元素?

例如这个有值:

mainList = {ArrayList@705}  size = 2
 0 = {HashSet@708}  size = 3
  0 = "A2"
  1 = "A1"
  2 = "A3"
 1 = {HashSet@709}  size = 3
  0 = "A6"
  1 = "A5"
  2 = "A7"

我想要一个像这样的新列表:

list = A2,A1,A3, A6, A5, A7

【问题讨论】:

  • 您的意思是没有Iterator<T> 还是没有迭代元素?
  • 不迭代元素。直接。
  • 好吧,如果不进行迭代,您无法做到这一点。您可以使用流,但它将使用内部迭代器。
  • @AniketSahrawat:你能给我指路吗?
  • @AniketSahrawat:你是对的!感谢您的诚实和“其他”解决方案。

标签: java list collections


【解决方案1】:

如果你只是好奇不使用迭代器,可以使用simple for each循环来解决目的

    List<Set<String>> hs = null ; // Actual given List<Set<String>
    ArrayList<String> arrayList = new ArrayList<String>(); // Plain List that will contain all the strings
    for(Set<String> set :hs) {
        arrayList.addAll(new ArrayList<String>(set)); // adding all the elements in list from hashset
    }

并以这种方式使用流(java 1.8 及更高版本)

    List<Set<String>> list = null ;
    List<String> al =  hs.stream().flatMap(Set::stream).collect(Collectors.toList());

但是你能解释一下为什么你不想使用迭代器吗?

【讨论】:

    【解决方案2】:

    你不能。通常,复制n 事物的唯一方法是遍历它们中的每一个。

    避免迭代元素的唯一方法是像数组副本这样的低级操作。

    ArrayList 会这样做(其他像 LinkedList 不会这样做)但是 JDK 中的 Set 实现没有提供自己的 toArray 实现。它们都使用AbstractCollection.toArray,它在内部迭代所有元素。

    如果您实现或找到了基于数组的Set 实现(不过,这几乎肯定不是最佳的Set),那么您可以通过使用一系列数组副本来展平ArrayList&lt;ArraySet&lt;String&gt;&gt;,而无需迭代元素。

    【讨论】:

      【解决方案3】:

      如果您使用的是 java 1.8 及更高版本,那么您可以使用流,但它仍将使用内部迭代器。这是一个例子:

      List<String> list = mainList.stream() // create stream
          .flatMap(Set::stream)             // convert Set<String> to Stream
          .collect(Collectors.toList());    // collect to new ArrayList
      

      【讨论】:

      • “不迭代元素”
      • @Michael Atleast 答案比说你不能。
      • No it isn't。这是完全有效的。如果不迭代元素是必需的,那么我的回答是正确的。如果不是要求,则此问题是重复的,应该关闭。
      • @Michael 我同意这是一个有效的答案,但是与 JDK 内部的争论依赖于实现细节,我认为你不需要关心并且可能依赖于版本之间的理论上的改变。
      • @daniu 实际上,我的解决方案最初被选为正确的。但迈克尔对这个问题发表了评论并改变了主意。 OutOfMemoryError 让我写一个答案,所以我写了。无论如何,没关系:)
      猜你喜欢
      • 2016-05-01
      • 2021-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多