是否有一种方法可以将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
答案 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
),则可以使用一系列{数组副本而无需遍历元素。