在数组中创建不同的值 - 不产生预期的结果

时间:2013-08-08 14:52:02

标签: java arrays

我正在尝试创建一个在其单元格中具有不同值的数组,但由于某种原因,它具有重复值。我哪里错了?

这是我的代码:

package oefarray;

public class OefArray {

    int[] getallenArray,differentArray;

    public static void main(String[] args) {
        OefArray arr = new OefArray();
        arr.differentArray(10,10);

    }

    public void differentArray(int n, int max) {
        differentArray= new int[n];
        for (int i = 0; i < differentArray.length; i++) {
            int value = (int) (Math.random() * max);
            differentArray[i]= value;
            for (int p: differentArray){
                while (value == p){
                    value = (int) (Math.random() * max);
                }
            }
            differentArray[i]= value;
            System.out.println(differentArray[i]);
        }
    }
}

2 个答案:

答案 0 :(得分:2)

您没有检查新生成的值是否存在于数组中的任何位置,只是它的值不等于您正在检查的当前值。

differentArray= new int[n];
for (int i = 0; i < differentArray.length; i++) {
    int value = 0;
    while(true){
        value = (int)(Math.random()*max);
        boolean found = false;
        for(int p: differentArray){
            if(p==value){
                found = true;
                break;
            }
        }
        if(!found) break;
    }
    differentArray[i] = value;
}

这是arshajii解决方案的替代方案,不需要直接引用ArrayList。正如他所指出的,这并不比他的解决方案更有效。如果你对列表不满意,那就是另一种写作方式。

int[] nums = new int[max];
for (int i = 0; i < max; i++)
    nums[i] = i;
Collections.shuffle(Arrays.asList(nums));
for (int i = 0; i < n; i++)
    differentArray[i] = nums.get(i);

答案 1 :(得分:0)

对于使用Java 8的未来主义方法,使用IntStream.generate可以产生一些非常简洁的结果。这可能在与前一个答案相同的性能窗口中执行,因此我不断言这是高效。然而,它更具表现力。

public int[] differentArray(int length, int maxValue) {
    if(length > maxValue) {
        throw new IllegalArgumentException("The number of possible unique values is smaller than available number of slots for them.");
    }
    final Random random = new Random();
    return IntStream.generate(() -> random.nextInt(maxValue))
                    .distinct()
                    .limit(length)
                    .toArray();
}