2012-07-09 74 views
0

我有两个java List<String>对象,我需要在第三个List<String>结果对象中添加前两个的所有可能组合。像:Java,如何在列表上正确实现嵌套迭代器?

List<String> list1 = getList1(); 
List<String> list2 = getList2(); 

List<String> result = new ArrayList<String>(); 

for(String value1 : list1) { 
    for(String value2 : list2) { 
     result.add(value1 + value2); 
    } 
} 

的问题是,当列表增长这个快速和肮脏的功能变得缓慢呈指数:

long combinations = list1.size() * list2.size()

也许我做错了,有没有更好的方法把它或任何可以使用的框架?

+1

如果列表中有许多重复项,您可能会做得更好。只需将每个'List'中的所有元素插入'Set',并使用相同的代码进行迭代。如果重复不常见,此方法会比当前方法稍差。如果您想查找所有组合,则必须至少花费与独特组合数量一样多的时间复杂度。 – nhahtdh 2012-07-09 03:09:45

+0

在这种情况下没有重复。 – Mark 2012-07-09 03:12:41

+0

我认为这种方法是最直接的。如果2列表中没有重复,则唯一可以做的是避免重新计算相同的组合。不过,尽管如此,我还是无法想到这么做。 – nhahtdh 2012-07-09 03:27:51

回答

0

为了使其更快,你可以提供初始容量的结果,这样的ArrayList的内部数组不顺延:

int capacity = list1.size() * list2.size(); 
List<String> result = new ArrayList<String>(capacity); 
+0

这略微改善了性能,总比没有好。 – Mark 2012-07-09 23:43:44

0

你可以通过调用result.size()而不是将大小乘以一起来得到你想要的结果吗?