比较数字并将其保存在Kotlin中的数组中

时间:2019-02-26 19:44:50

标签: arrays kotlin compare

两部分问题

第一部分-我想问用户一个数字,然后创建一个数组,该数组的位置与所引入的数字一样多,我该怎么做?

第二部分-数组将填充随机数,但我不想重复数字。这是我的代码,它会不断注册重复的数字

var A = intArrayOf(0,0,0,0,0,0)
for (i in 0..A.size - 1) {
    val rnd = (0..10).random()
    for (j in 0..A.size-1) {
        if (rnd == A[j]){
            break
        }
        else{
            A[i] = rnd
            break
        }
    }
}

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

您可以向用户询问数组项的数量,如下所示:

var n = 0

println("Number of items in the array = ")
try {
    n = readLine()!!.toInt()
} catch (e: Exception) {
}

如果n是一个正整数,则数组将被初始化,然后用随机的非重复整数填充:

if (n > 0) {
    val array = IntArray(n) // initialize an array of n items all being 0

    val r = Random() // create a random numbers generator
    array.indices.forEach {
        var newInt = 0
        while (array.contains(newInt)) { newInt = r.nextInt() }
        array[it] = newInt
    }
    array.forEach { print("$it ") }
}

使用contains(),您可以检查新生成的随机数是否已存在于数组中(这意味着该数组将由非零整数填充)。
如果您希望随机数在特定范围内,请选择:

newInt = r.nextInt()

使用:

newInt = r.nextInt((upperBound + 1) - lowerBound) + lowerBound

或对于Kotlin 1.3+版本:

newInt = (lowerBound..upperBound).random()

答案 1 :(得分:1)

要记住的一件事是,如果您尝试生成某个范围内的随机数,但是没有重复项,则需要确保随机数的范围至少等于目标数组的大小。

例如,如果您尝试生成大小为12且范围为0..10的数组,则无法完成,因为只有11种可能性。

根据您的要求(直到数组的大小,范围是否为0?)如果数字的空间很小,则可以通过将列表从rangeStart..rangeEnd改组来简化此操作:

/**
 * Generates an array of unique random numbers between zero and the larger of
 * arraySize or upperBound. If upperBound is not specified, it defaults to be
 * arraySize.
 *
 * @param arraySize the size of the returned integer array
 * @param upperBound an optional upper bound for the range of random numbers
 */
fun generateArray(arraySize: Int, upperBound: Int = size): IntArray {
  return (0..Math.max(upperBound, arraySize)).shuffled().take(arraySize).toIntArray()
}

这还避免了废弃的重复随机数的浪费,并确保函数调用花费确定的时间来执行。