我想以这样的方式遍历我的arraylist,
如果它是int i = 0 = b(0),它将消除 b(0)并乘以
b.get(1)*b.get(2) = 3*6
如果它是int i = 1 = b(1),它将消除 b(1)并乘以
b.get(0)*b.get(2) = 1*6
如果它是int i = 2 = b(2),它将消除 b(2)并乘以
b.get(0)*b.get(1) = 1*3
我试过了,但这不是我想要的
1*3
1*6
3*1
3*6
6*1
6*3
码
ArrayList<Integer> b = new ArrayList<Integer>();
b.add(1);
b.add(3);
b.add(6);
for(int i = 0; i < b.size(); i++) {
for(int j = 0; j < b.size(); j++) {
if(b.get(i) != b.get(j)) {
System.out.println(b.get(i) + "*" + b.get(j));
}
}
}
通过这样做
for(int i = 0; i < b.size(); i++) {
for(int j = i+1; j < b.size(); j++) {
if(b.get(i) != b.get(j)) {
System.out.println(b.get(i) + "*" + b.get(j));
}
}
}
我会得到
的输出1*3
1*6
3*6
这是错误的。
期望的输出
3*6
1*6
1*3
答案 0 :(得分:2)
从i + 1开始第二个循环(并且不再需要if)
for(int j = i+1; j < b.size(); j++)
编辑:
for(int i = 0; i < b.size(); i++) {
for(int j = 0; j < b.size(); j++){
for(int k = j+1; k < b.size(); k++) {
if(j != i && k != i)
System.out.println(b.get(j) + "*" + b.get(k));
}
}
}
答案 1 :(得分:1)
只需将j循环设置为从
开始i + 1
这只会打印一次。
答案 2 :(得分:0)
假设您不关心订单,您只需列出所有可能的无序对,其中包含整数列表(1
,3
和6
)中的不同元素提供。
因此,让我们首先循环遍历第一个元素的列表:
for(int i = 0; i < b.size(); ++i) {
// something with b.get(i)
}
接下来我们需要第二个元素。如果,对于j
,我们再次从索引0
开始,我们需要检查j
是否等于i
。此外,当我们使用0
获得大于i
的某个索引时,我们还会使用j
遍历所有小于i
的元素。这会为您提供重复项6 * 3
和3 * 6
以及类似内容。
所以我们不希望j = i
,我们也不想要j < i
。所以我们从j = i +
开始,它为我们提供了我们想要的所有配对,仅此而已。
for(int i = 0; i < b.size(); ++i) {
for(int j = i + 1; j < b.size(); ++j) {
// something with b.get(i)
}
}
如果您绘制乘法表
| 1 | 3 | 6
1 | 1*1 | 1*3 | 1*6
3 | 3*1 | 3*3 | 3*6
6 | 6*1 | 6*3 | 6*6
你知道,我们正在看三角形的值。我们从1 * 3,1 * 6(以及更多,如果我们有更多的整数)开始,并继续在下一行中一列右移3 * 6.