从字符串集列表到普通列表

时间:2019-04-02 11:01:05

标签: java list collections

是否有一种方法可以将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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

如果您只是对不使用迭代器感到好奇,可以对每个循环使用simple来解决目的

    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 :(得分:0)

不能。通常,复制n的唯一方法是对每个对象进行迭代。

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

ArrayList可以做到这一点(其他类似LinkedList却不能做到),但是JDK中没有Set实现提供其自己的toArray实现。它们都使用AbstractCollection.toArray,它在内部迭代所有元素。

如果您实现或发现了基于数组的Set实现(然而,几乎肯定不是最佳的Set),则可以使用一系列{数组副本而无需遍历元素。