java - 如何有效地对抽象列表进行嵌套迭代?

标签 java list iteration cartesian-product idioms

我正在尝试复制“遍历自笛卡尔积的上对角矩阵”的典型构造,并将列表作为源。通俗地说,如果我有一个数组 a 我想这样做:

for (int i = 0; i < a.length; i++) {
  for (int j = i; j < a.length; j++) {
    collect(a[i], a[j]);
  }
}

但是有了一个抽象的 List,我不能依赖于高效地通过索引访问。

我考虑过这一点,它具有内存和时间效率(因为调用 sublist 使用原始列表作为支持结构)但看起来不符合 Java 的惯用方式:

for (List<E> tail = list; !tail.isEmpty(); tail = tail.sublist(1, tail.size()) {
  E a = tail.get(0);
  for (E b : tail) {
    collect(a, b);
  }
}

还有更好的选择吗?


示例:

如果输入序列是[1, 2, 3]并且占位符collectSystem.out.println,输出应该是对(索引,而不是值)i>=j:

1 1
1 2
1 3
2 2
2 3
3 3

并且不是所有可能的对(这可以通过两个简单的循环来完成)。

最佳答案

public static void collect(List<Integer> data) {
    List<Integer> a = data instanceof RandomAccess ? data : new ArrayList<>(data);

    for (int i = 0; i < a.size(); i++)
        for (int j = i; j < a.size(); j++)
            collect(a.get(i), a.get(j));
}

关于java - 如何有效地对抽象列表进行嵌套迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50736746/

相关文章:

java - Jersey/JAXB : Use same POJO for HTTP POST and GET, 但在 JSON 响应中仅返回 GET 属性的子集。

Python 列表插入函数和数据类型问题

python - 当if语句为真时如何停止迭代?

java - GWT 2.4 应用程序找不到我的 CSS 文件,其类正在通过 UIObject.addStyleName 在代码中使用

java - Swagger @ApiModelProperty 必填字段似乎被忽略(版本 1.3.6)

python - 如何通过字符串将 pandas 数据框分割成 block ?

r - 创建多个根据现有变量计算的新变量

python - SQLALCHEMY - 遍历数据

java - 如何将字符串中的 double 据转换为在 android studio 上的 TextView 上设置

python - 编写 if 语句以避免某些列表项的更好方法是什么?