创建一个 Class 来创建 Int 数组,元素位于两个 args(intStart, intEnd) 之间

Creating a Class that creates array of Int with elements between two args(intStart, intEnd)

大家好,感谢您的宝贵时间! 我这里有个问题。简而言之,我想创建一个 class 的实例,它在 class 的两个参数之间存储数据。类似于“IntRange”class 的作品。 例如:val r1 = IntRange(0,5) // 输出 0 1 2 3 4 5。 试图尽可能多地解释,英语不是mouther tongue :) 我尝试过的:

fun main(args: Array<String>) {
    val ownArray = OwnIntRange(0,2).getNumbers()
    
}

public interface Counter{
    fun getNumbers(): Array<Int>
    var counter: Int
}

class OwnIntRange(val intMin: Int, val intMax: Int): Counter{
    override var counter = 0
    override fun getNumbers(): Array<Int> {

        for (number in intMin..intMax){
            getNumbers()[counter] = number
            counter++
        }
        return getNumbers()
    }
}

//result: WhosebugError

如果你能纠正我的方法,我会很高兴。欢迎批评!

Java 8

override fun getNumbers(intMin: Int, intMax: Int): IntArray {
    return IntStream.rangeClosed(intMin,intMax).toArray()
}

override fun getNumbers(intMin: Int, intMax: Int): List<Int> {
        return IntStream.rangeClosed(intMin,intMax).toList()
    }

rangeClosed -> Returns 从 startInclusive(包含)到 endInclusive(包含)的顺序有序 IntStream,增量为 1.

public static IntStream rangeClosed(int startInclusive, int endInclusive)

问题是您的 getNumbers() 函数总是至少调用自己一次。哪个自称。哪个自称。它调用自己......因此它陷入了无休止的嵌套调用系列,并耗尽堆栈 space 来存储它们。

Recursion 可以是一个有效的技术,但你总是需要一个终止条件,超过它停止调用自身并开始返回——你的代码没有。但是,在这种情况下根本不需要递归。

我不能完全理解你在该实现中的意图,但这里有一个稍微不同的方法:

override fun getNumbers(): Array<Int> {
    val a = Array<Int>(intMax - intMin + 1){ 0 }

    for (number in intMin..intMax)
        a[number - intMin] = number

    return a
}

(请注意,这不使用 counter;看起来根本不需要。)

通过更好地使用 Array constructor:

init 参数,可以写得更简单(也稍微更有效)
override fun getNumbers() = Array(intMax - intMin + 1){
    it + intMin
}

在变量名中包含类型也不常见(可以说 not a good idea);简单地称他们为例如minmax 会更简单易读。 (如果您将类型从 Int 更改为 Long 或其他任何类型,它也不需要重命名。)

当然,在生产代码中你可能根本不需要这个 class,因为 IntRange 就可以了。如果您 确实 需要自己的 class,我会非常认真地考虑是否真的需要 getNumbers() 方法,因为几乎肯定会有更好的方法没有创建临时数组,例如通过使用访问者模式。