从袋子里画豆子

时间:2017-03-30 02:59:54

标签: java arrays list for-loop arraylist

我有一个程序从包中取出豆子并在以下条件下将其删除。然而,我的结果似乎根本没有关联,似乎豆子没有被记住。

public class Prog477h {

public static void main(String[] args) {
    ArrayList<Integer> beans = new ArrayList<Integer>(); //make arrayList and add first 10 random beans
    Random addrand = new Random();
    for (int i = 0; i < 10; i++) {
        int bean = addrand.nextInt(2);
        beans.add(bean);
    }
    //print title
    System.out.println("Beans\tBlack\tWhite\tLast");        
    for (int i = 0; i <= 50; i++) { //start for loop for 50 iterations
        int whites = countWhite(beans); //count the initial white
        int blacks = countBlack(beans); //count the initial black
        String last = getLast(beans); //get the last
        System.out.println(beans.size() + "\t" + blacks + "\t" + whites + "\t" + last + "\t"); //print row

        //draw two beans and remove them
        Random drawRand = new Random();
        int draw1 = drawRand.nextInt(beans.size());
        int beanDrawn1 = beans.get(draw1);
        beans.remove(beanDrawn1);
        int draw2 = drawRand.nextInt(beans.size());
        int beanDrawn2 = beans.get(draw2);
        beans.remove(beanDrawn2);

        //check the beans if they are 0 then they are white and if they are 1 they are black
        if (beanDrawn1 == 0 && beanDrawn2 == 0) { 
            beans.add(1); //both white, add a black
        } else if (beanDrawn1 == 1 && beanDrawn2 == 1) {
            beans.add(beanDrawn1); //both black add one back
        } else if (beanDrawn1 == 1 && beanDrawn2 == 0) {
            beans.add(beanDrawn2); //one black one white, add white back
        } else if (beanDrawn1 == 0 && beanDrawn2 == 1) {
            beans.add(beanDrawn1); //same as above
        }

        //add two random beans to offset for a +1 bean increase
        int bean = addrand.nextInt(2);
        beans.add(bean);
        bean = addrand.nextInt(2);
        beans.add(bean);
    }


}

//get the last
static String getLast(ArrayList<Integer> a) {
    String display = "";
    int last = a.get(a.size() - 1);
    if (last == 0) {
        display += "White";
    } else {
        display += "Black";
    }
    return display;
}

//get the white
static int countWhite(ArrayList<Integer> a) {
    int whites = 0;
    for (int i : a) { //go through loop and increase at 0s
        if (a.get(i) == 0) {
            whites++;
        }
    }
    return whites;
}

//get the black
static int countBlack(ArrayList<Integer> a) {
    int blacks = 0;
    for (int i : a) { //go through loop and increase at 1s
        if (a.get(i) == 1) {
            blacks++;
        }
    }
    return blacks;
}

}

我得到的输出是。

Beans Black White Last 10 6 4黑色
11 5 6黑色
12 0 12白色
13 13 0白色
14 14 0白色
15 11 4白色
16 12 4白色
17 0 17白色
18 13 5白色
19 0 19白色
20 0 20白色
21 8 13白色
22 7 15白色
23 15 8白色 24 14 10黑色
25 25 0黑色
26 0 26黑色
27 0 27黑色
28 14 14白色 29 15 14白色 30 14 16黑色
31 0 31黑色
32 0 32黑色
33 19 14白色 34 34 0黑色
35 35 0白色
36 36 0黑色
37 19 18白色 38 19 19黑色 39 0 39白色
40 40 0白色
41 20 21黑色
42 23 19黑色
43 43 0白色
44 44 0白色
45 0 45白色
46 21 25白色
47 22 25黑色
48 48 0黑色
49 0 49黑色
50 24 26白色
51 27 24白色
52 0 52白色
53 27 26黑色
54 28 26黑色
55 0 55白色
56 29 27白色 57 57 0白色
58 58 0黑色
59 32 27黑色
60 0 60白色

例如,您无法在上次试用中将所有白豆更改为白色。 Wtf是错的,请帮忙。

1 个答案:

答案 0 :(得分:0)

我认为问题可能在于删除bean的方式。

int draw1 = drawRand.nextInt(beans.size());
int beanDrawn1 = beans.get(draw1);
beans.remove(beanDrawn1);
int draw2 = drawRand.nextInt(beans.size());
int beanDrawn2 = beans.get(draw2);
beans.remove(beanDrawn2);

基本上,你正在做的是从bean ArrayList获取一个随机索引,并在该索引处得到结果,该索引为0或1。

beans.remove方法的工作方式是删除放入方法的INDEX中的元素。

因此,

beans.remove(beanDrawn1);

将删除数组的第一个或第二个元素,具体取决于其是白色还是黑色。而不是删除随机索引。

如果要删除随机索引,只需跳过中间部分并执行

beans.remove(draw1);

我认为这就是一些豆子不会被记住的方式&#34;如你所说。然而,我还没有对此进行过测试,所以请尝试更改并查看它是否有效。