比较数组中的元素并获取新元素

时间:2017-04-11 18:13:42

标签: java arrays compare processing

我意识到之前已经问过这个问题,但是,对我来说,它只适用于某一点。经过一番努力,我以为我会问。 我在对象的构造函数中有一个浮点数组。

就是这样:

count = 3;
angles = new float[count];

尽管我希望实现模块化和可重用的方法,但数组长度确实很小。

我循环遍历指定浮点数的数组:

for (int i = 0; i < angles.length; i++) {
        angles[i] = radians(random(360));
}

然后,通过一个新的循环,我检查它们之间的奇异元素是否小于30度,如果是,则指定一个新的随机值:

for (int i = 0; i < angles.length; i++) {
        for (int k = i+1; k < angles.length; k++){
            if(angles[i] != angles[k]){
                if(abs(angles[i] - angles[k]) <= radians(30)){
                    angles[i] = radians(random(360));
                }
            }
        }
}

这很好用,但它并不能保证新的随机数会与剩余的元素保持30度的限制。我认为,这与&#39; for&#39;的长度有关。环。

最好的方法是什么才能克服这一点并保证新获取的数字始终符合30度规则?

3 个答案:

答案 0 :(得分:0)

您可以将其更改为while语句,而不是仅使用if语句检查一次,以便尝试查找新的随机数,直到新的随机数为止。

while (abs(angles[i] - angles[k]) <= radians(30)){
    angles[i] = radians(random(360));
}

但是,如果没有符合30度规则的数字,您的程序将停留在此循环中,因此您可能需要在进入循环之前检查是否存在可能的解决方案。

编辑:上述解决方案将确保数字遵循30度规则,数组中只有一个数字。添加一个布尔值以确定是否满足条件,并循环直到布尔值为真。

for (int i = 0; i < angles.length; i++) {
    boolean meetsCondition = false;
    while (!meetsCondition) {
        for (int k = 0; k < angles.length; k++){
            if(i != k){
                if(abs(angles[i] - angles[k]) <= radians(30)){
                    angles[i] = radians(random(360));
                    meetsCondition = false;
                    break;
                }
            }
        }
        meetsCondition = true; //if the for loop completes, it has met the condition.
    }
}

答案 1 :(得分:0)

为什么不在之前使用递归:

for (int i = 0; i < angles.length; i++) {
    angles[i] = findSuitable( i==0 ? 0 : angles[i-1] )
}


... 

float findSuitable(float limit){
       float sample = radians(random(360));
       if(Math.abs(sample-limit) > 30)
           return sample;
       else
           return findSuitable(limit);
}

答案 2 :(得分:-1)

在我看来,您可以尝试将随机代码更改为:

随机d = new Random(); int a = d.nextInt(360);