java - Arrays.sort 不填充数组,覆盖数组中已有的值

标签 java

我需要生成一个数组int[] randomNumbers没有重复的随机数。为此,我创建了一个数组,其中包含可以进入 randomNumbers 的所有值。 ,然后使用随机数生成器从列表中选择一个,检查它是否已经在 randomNumbers 中,如果不是,请将其放入 randomNumbers .

(我想要 1 到 max 之间的数字,而不是 0 到 max-1)

为了能够使用 Arrays.sort(int[]),需要对列表进行排序。所以我使用第三个数组,其值与randomNumbers相同。叫sortedNumbers ,并在每次迭代时对其进行排序:

public int[] uniqueRandom(int max, int numRequired) {
    if (max < numRequired) {
        numRequired = max;
    }
    int[] randomNumbers = new int[numRequired];
    int[] sortedNumbers = new int[numRequired];
    int[] sequentialNumbers = new int[max];
    for (int i = 1; i < max; i++) {
        sequentialNumbers[i] = i;
            System.out.println(sequentialNumbers[i]);
    }

    int p = 0;
    while (p < numRequired) {
        int j = r.nextInt(max) + 1;
        System.out.println("J:" + j);
        if (Arrays.binarySearch(sortedNumbers, j) >= 0) {
            System.out.println("Number Found:" + Arrays.binarySearch(randomNumbers,  j));
        } else {
            randomNumbers[p] = j;
            sortedNumbers[p] = j;
            Arrays.sort(sortedNumbers);
            for (int i = 0; i < randomNumbers.length; i++) {
                System.out.println("rNum[" + i + "]:" + randomNumbers[i]);
            }
            System.out.println("\n");
            for (int i = 0; i < randomNumbers.length; i++) {
                System.out.println("sNum[" + i + "]:" + sortedNumbers[i]);
            }
            p++;
        }

    }

    return randomNumbers;
}

我的问题是我得到的输出为 sortedNumbers正在覆盖值。对于 uniqueRandom(5, 5),输出为:

J:2
rNum[0]:2
rNum[1]:0
rNum[2]:0
rNum[3]:0
rNum[4]:0

sNum[0]:0
sNum[1]:0
sNum[2]:0
sNum[3]:0
sNum[4]:2


J:2 // 2 already in the list, try again


J:2


J:4
rNum[0]:2
rNum[1]:4
rNum[2]:0
rNum[3]:0
rNum[4]:0

sNum[0]:0
sNum[1]:0
sNum[2]:0
sNum[3]:2
sNum[4]:4


J:5
rNum[0]:2
rNum[1]:4
rNum[2]:5
rNum[3]:0
rNum[4]:0

sNum[0]:0
sNum[1]:0
sNum[2]:2
sNum[3]:4
sNum[4]:5


J:2


J:3
rNum[0]:2
rNum[1]:4
rNum[2]:5
rNum[3]:3
rNum[4]:0

sNum[0]:0  // Should be:
sNum[1]:0  // 2
sNum[2]:2  // 3
sNum[3]:3  // 4
sNum[4]:5  // 5


J:4
rNum[0]:2
rNum[1]:4
rNum[2]:5
rNum[3]:3
rNum[4]:4

sNum[0]:0
sNum[1]:0
sNum[2]:2
sNum[3]:3
sNum[4]:4

所以你可以看到这个问题。我正在使用 java 1.7,并且不知道为什么它会这样做!

最佳答案

为了解决您的问题,我将使用一个 Set,以确保我们获得独特的结果。

下面的截图将生成具有所需数量的唯一整数的数组。

Set<Integer> uniqueNumbers = new HashSet<Integer>();
Random r = new Random();
while(uniqueNumbers.size() < numRequired) {
    uniqueNumbers.add(r.nextInt(maxRandom) + 1);
} 
return uniqueNumbers.toArray(new Integer[0]);

关于java - Arrays.sort 不填充数组,覆盖数组中已有的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13068888/

相关文章:

java - Play Framework : Routing broken

java - 从 List<Map> 中检索值并将其插入到另一个 List<Map> 中

java - hibernate 搜索,现有数据不可搜索

java - 在 servlet 中恢复控制后如何恢复该值?

java - Cucumber:场景中的使用文件

java - 在 onClick(View arg0) 中使用 Sleep(int ms)

java - 如何将崩溃信息从我的 Android 应用程序发送到我的服务器?

java - 为什么Java读取文件这么难

java - Axon框架-GZIP JSON数据

java - Android 媒体记录器停止异常