【问题标题】:Java, how to properly implement nested iterators on Lists?Java,如何在列表上正确实现嵌套迭代器?
【发布时间】:2012-07-09 03:03:47
【问题描述】:

我有两个 java List<String> 对象,我需要在第三个 List<String> 结果对象中添加前两个对象的所有可能组合。喜欢:

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()

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

【问题讨论】:

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

标签: java performance list nested


【解决方案1】:

为了让它更快,你可以给结果提供初始容量,这样ArrayList的内部数组就不会被扩展:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      稍微困难但绝对更好的方法是扩展unmodifiable AbstractCollection (or AbstractList) 和关联的迭代器(将根据需要在两个List 迭代器上进行迭代)。这样组合列表就不需要 O(N*M) 存储空间。

      【讨论】:

        猜你喜欢
        • 2013-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        相关资源
        最近更新 更多