我正在开发一个程序来掷4个6面骰子,并用它们做一些简单的数学和逻辑运算。我正在运行该程序的非常粗糙的草稿,并开始注意到卷数会不一致。特别是我有时不会得到最小值或得到两个

如果四处寻找在线解决方案无济于事。我什至从其他示例中复制了有关如何找到最小值的代码

public class test {
    private static int dice(int s) {
        int num = 0;
        Random random = new Random();
        num = random.nextInt(s);
        num = num + 1;
        return num;
    }

    public static void main(String[] args) {
        List<Integer> rolls = new ArrayList<Integer>();
        for (int i = 0; i != 4; i++) {
            rolls.add(dice(6));
        }
        for (Integer roll : rolls) {
            System.out.println(roll);
        }
        int min = rolls.get(0);
        int index = 0;
        for (int x = 0; x < rolls.size(); x++) {
            if (rolls.get(x) < min) {
                min = rolls.get(x);
                index = x;
                System.out.println("Smallest: " + min);
            }
        }

        int sum = 0;
        for (int x : rolls) {
            sum += x;
        }
        System.out.println("Sum:" + sum);
    }
}


这将产生4卷6面骰子。然后它应该找到打印出的最小值,然后计算总和并打印出来

最佳答案

查看以下代码:

int min = rolls.get(0);
int index = 0;
for(int x = 0; x<rolls.size(); x++){
    if(rolls.get(x) < min){
       min=rolls.get(x);
       index = x;
       System.out.println("Smallest: " + min);
    }
}


如果rolls.get(0);是您的最低要求会怎样?在这种情况下,if(rolls.get(x) < min)始终为false,并且永远不会打印“ Smallest ...”。

另请注意,每次找到的卷比上一次查看的小时,都会再次打印出“最小...”,因此,如果您将多个骰子按降序排列,则将该行打印多次。

将您的初始min值设置为7,这样就可以确保其最小值小于初始状态。然后,保存分钟并在循环结束后打印“ Smallest ...”,而不是在循环内部打印:

// Be aware that this code doesn't work correctly if your List is empty.
int min = 7; // You could also set this to rolls.get(0) and start your loop at 1
for (int x = 0; x < rolls.size(); x++) {
    if (rolls.get(x) < min) {
        min = rolls.get(x);
    }
}
System.out.println("Smallest: " + min);


(我也删除了index,因为它在您的代码中的任何地方都没有使用)。



如果您希望与此同时变得更现代(也更强大),则可以执行以下操作:

rolls.stream()
     .min(Integer::compareTo)
     .ifPresent(min -> System.out.println("Smallest: " + min));


通过不打印任何内容,可以处理rolls为空的情况。

09-19 00:28