Java - 在ArrayList中的每n个元素之后插入一个元素

时间:2016-12-11 18:22:49

标签: java arrays

我的目标是创建一个包含22个元素的数组,其中必须有11个元素" G"和11个元素" B"。数组中的每个第5个元素都是" B"。

也就是说,数组中的第5个元素是B,第10个是B,第15个是B,第20个是B.数组应该在最后一个元素后面并跳过现有的B元素,因此下一个B是第3个元素,后跟第9个元素,依此类推。

到目前为止,这是我的代码和现有输出:

private static ArrayList<String> circle;

public static void main(String[] args) {
    // TODO Auto-generated method stub
    circle = new ArrayList<String>();

    for(int i=0; i< 22; i++){
        circle.add("G");
    }

    for(int i=0; i<circle.size(); i++){
        if((i+1) % 5 == 0){
            circle.set(i, "B");             
        }
    }
    for(int i=0; i<circle.size(); i++){
        System.out.printf("%3d", (i+1));
    }
    System.out.print("\n");
    for(int i=0; i<circle.size(); i++){
        System.out.printf("%3s", circle.get(i));
    }

}
/* Output */
/*  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22
    G  G  G  G  B  G  G  G  G  B  G  G  G  G  B  G  G  G  G  B  G  G */

所需的输出是

/* Desired Output */
/*  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22
    B  G  B  G  B  B  G  B  G  B  B  G  B  G  B  G  G  B  G  B  G  G */

我该如何解决? 谢谢!

3 个答案:

答案 0 :(得分:1)

这是重要的循环位 - 它取代了在原始代码中设置B的for循环。

    int numBs = 0;
    int idx = 4;
    while (numBs < 11) {
        Circle.set(idx % 22, "B");
        numBs++;
        idx += 5;
    }

它从索引4开始(因为第一个元素是0,第五个元素是索引4)。

然后每次只增加5 idx。神奇的是模运算符,它使它环绕。

idx:      4   9   14   19   24   29
idx % 22: 4   9   14   19   2    7
element:  5   10  15   20   3    8

这并不能保证你有任何数组大小的11个B - 因为如果前面的元素是G,你只需要增加numBs

输出:

  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22
  B  G  B  G  B  B  G  B  G  B  B  G  B  G  B  G  G  B  G  B  G  G

答案 1 :(得分:1)

    int max = 22;
    int count = 0; // count number of B's
    String x[] = new String[22];
    int i = 4; // starting index
    while (count < 11) {
        x[i] = "B";
        count++;
        int c = 0;
        // we will take five steps to find new index
        while (c < 5) {
            i++;
            i%=22;
            if(x[i] == "B") ; // dont count it as step if its already B
            else c++;
        }

    }
    // fill with G
    for (i = 0; i < 22; i++) {
        if (x[i] != "B")
            x[i] = "G";
    }

    System.out.println(Arrays.toString(x));

输出

[B, G, B, G, B, G, B, G, B, B, G, G, G, B, B, B, G, G, G, B, G, B]

答案 2 :(得分:0)

你说你想要的输出有点不正确。在第3个元素之后,必须在B而不是第9个元素上设置第8个元素。用“G”s填充列表后,此循环应该足够了:

cut

Here是代码的演示。如果你可以,你可能想要使用一个字符数组而不是一个字符串列表。