Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,如何正确实现列表上的嵌套迭代器?_Java_Performance_List_Nested - Fatal编程技术网

Java,如何正确实现列表上的嵌套迭代器?

Java,如何正确实现列表上的嵌套迭代器?,java,performance,list,nested,Java,Performance,List,Nested,我有两个javaList对象,我需要在第三个Listresult对象中添加前两个对象的所有可能组合。比如: List<String> list1 = getList1(); List<String> list2 = getList2(); List<String> result = new ArrayList<String>(); for(String value1 : list1) { for(String value2 : list

我有两个java
List
对象,我需要在第三个
List
result对象中添加前两个对象的所有可能组合。比如:

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);
    }
}
List list1=getList1();
List list2=getList2();
列表结果=新建ArrayList();
for(字符串值1:list1){
for(字符串值2:list2){
结果。添加(值1+值2);
}
}
问题是,当列表增长时,这个快速而肮脏的函数会以指数级速度变慢:

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


可能是我做错了,有没有更好的方法或可以使用的框架?

调用result.size()而不是将大小相乘,可以得到您想要的吗?

为了加快速度,您可以为结果提供初始容量,这样ArrayList的内部数组就不会扩展:

int capacity = list1.size() * list2.size();
List<String> result = new ArrayList<String>(capacity);
int capacity=list1.size()*list2.size();
列表结果=新阵列列表(容量);

稍微困难但肯定更好的方法是扩展和关联的迭代器(这将根据需要在两个
列表
迭代器上进行迭代)。这样,组合列表就不需要O(N*M)存储。

如果列表中有许多重复项,您可能会做得更好。只需将每个
列表
中的所有元素插入
集合
,并使用相同的代码进行迭代。如果复制不常见,此方法将比当前方法稍差。如果你想找到所有的组合,你必须花费至少和唯一组合数量一样多的时间复杂度。在这种情况下没有重复。我认为这种方法是最直接的。如果2列表中没有重复项,那么唯一可以做的就是避免重新计算相同的组合。不过,我想不出怎么做。那就用一套吧!Set allValues=newhashset(列表1);allValues.addAll(列表2);我不能,因为我需要在两个值之间进行连接。例如,如果value1(属于列表1)为“一”,value2(属于列表2)为“二”,则生成的对象应为:“onetwo”。