我正在尝试复制“遍历自笛卡尔积的上对角矩阵”的典型构造,并将列表作为源。通俗地说,如果我有一个数组 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]
并且占位符collect
是System.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/