【发布时间】:2018-11-17 02:30:12
【问题描述】:
我正在尝试复制“遍历自笛卡尔积的上对角矩阵”的典型构造,并以列表为源。用外行的话来说,如果我有一个数组 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
并且不是所有可能的对(可以通过两个简单的循环来完成)。
【问题讨论】:
-
“抽象列表”是什么意思?
collect(..)方法有什么作用?样本输入和预期输出是什么?这个问题对我来说很不清楚。 -
他有一个基类
List的对象。根据列表的具体实现,按索引访问对象效率低下,例如LinkedList。据我了解,他正在寻找一种不依赖于将get(i)用于i != 0的解决方案。 -
您是否考虑过使用列表的迭代器@fortran?
-
看过答案后,我认为您当前的解决方案还不错。顺便说一句,您可以使用
!tail.isEmpty()而不是tail.size() > 0使其更清晰。 -
是的,都是因为在Java中,迭代器不能被复制,这很可惜。它们可以使用其他一些语言,例如 C++。
标签: java list iteration cartesian-product idioms