Java:循环和乘法

时间:2014-11-07 09:08:14

标签: java arraylist

我想以这样的方式遍历我的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

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)

假设您不关心订单,您只需列出所有可能的无序对,其中包含整数列表(136)中的不同元素提供。

因此,让我们首先循环遍历第一个元素的列表:

for(int i = 0; i < b.size(); ++i) {
    // something with b.get(i)
}

接下来我们需要第二个元素。如果,对于j,我们再次从索引0开始,我们需要检查j是否等于i。此外,当我们使用0获得大于i的某个索引时,我们还会使用j遍历所有小于i的元素。这会为您提供重复项6 * 33 * 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.