java - 如何压缩这段代码?

标签 java

我收到了一些代码,我试图通过压缩将其置于更好的格式中:

ArrayList<Integer> a =  new ArrayList<Integer>();
ArrayList<Integer> c = new ArrayList<Integer>();

for(int i = 0; i < 10; i++) {

    int nextInt = rand.nextInt();

    while((a.contains(nextInt) ? 1:0) + ((nextInt < 0) ? 1:0) + 
                                        ((nextInt > 1000) ? 1:0) >= 1){
        nextInt = rand.nextInt();
    }

    a.add(nextInt);

    nextInt = rand.nextInt();   

    while(((c.contains(nextInt))?1:0) + ((nextInt < 0)?1:0) +
                                        ((nextInt > 1000)?1:0) >= 1) {
        nextInt = rand.nextInt();               
    }

    c.add(nextInt); 
}

在 while 循环中有完全相同的代码,但我想知道如果合并它是否会丢失随机性。但是, while 条件对我来说似乎很奇怪;谁能解释一下?你会如何压缩这段代码?

最佳答案

while 条件让我想起了 C 风格的条件,其中 false 是 0 而 true 是 0 以外的东西。但是,Java 有明确的 boolean 值,所以对条件使用这样的东西更有意义:

a.contains(nextInt) || (nextInt < 0) || (nextInt > 1000)

该代码被放入 while 循环中,因为该代码显然需要生成一个从 0 到 1000(含)的唯一数字列表。如果它违反了被“ored”的三个条件中的任何一个,那么我们需要生成一个新的随机数并重试。如果违反了第一个条件,则说明该数字不唯一,如果违反后两个条件中的任何一个,则说明该数字不在指定范围内。

我可能会将该循环放在名为 generateUniqueValueInrange 或类似方法的方法中,并将列表和边界作为参数。此外,我猜测 rand 是一个 java.util.Random 对象。请注意,Random 有一个 nextInt(int n) 方法,它会为您生成一个范围内的数字,这样您就不必一直生成新的数字,直到它们发生落在你想要的范围内。参见 http://download.oracle.com/javase/6/docs/api/java/util/Random.html#nextInt%28int%29

另请注意,您正在尝试生成两个列表,其中包含从 0 到 1000 的 10 个唯一数字。因此,您可能会考虑使用更直接的方法来做到这一点。我个人基本上使用这里的方法来完成类似的任务,但是“循环直到随机性对我有用”方法很容易出错,因为如果条件不可行,很容易进入无限循环。

关于java - 如何压缩这段代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5850244/

相关文章:

java - 如何将 .java 文件添加到 MonoDroid 项目

java - 通过 URL HeadlessChrome 的 Selenium 基本身份验证(在 Linux 服务器上)

java - 调用notifyDataSetChanged后 ListView 更新不起作用

java - Fragments 中的 ViewPager 错误

java - 如何通过鼠标移动检测 JLabel 中的单击? (如 JButton)?

java - 是否有 Hamcrest 匹配器来检查 Collection 既不为空也不为空?

java - 正则表达式匹配末尾有换行的文本

java - 从 Selenium 执行的 AutoIT 脚本修改主机文件

java - 二分查找中的第一次出现

java - 如何使用正确的编码将所有控制台输出重定向到 Swing JTextArea/JTextPane?