我正在尝试创建一个在其单元格中具有不同值的数组,但由于某种原因,它具有重复值。我哪里错了?
这是我的代码:
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]);
}
}
}
答案 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();
}