【问题标题】:Creating a Class that creates array of Int with elements between two args(intStart, intEnd)创建一个创建 Int 数组的类,其中包含两个 args(intStart, intEnd) 之间的元素
【发布时间】:2021-08-08 19:46:54
【问题描述】:

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

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: StackOverflowError

如果您能纠正我的做法,我会非常高兴。欢迎任何评论家!

【问题讨论】:

    标签: arrays kotlin logic


    【解决方案1】:

    问题是你的getNumbers() 函数总是至少调用一次自己。它自称。它自称。它会调用自己……  所以它会陷入无休止的一系列嵌套调用中,并耗尽堆栈空间来存储它们。

    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);简单地打电话给他们,例如min 和 max 会更简单,更容易阅读。 (如果您将类型从 Int 更改为 Long 或其他任何内容,也不需要重命名。)

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

    【讨论】:

    • 现在我明白了!非常感谢。你的回答太棒了,涵盖了我所有的问题。
    【解决方案2】:

    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 -> 返回从 startInclusive(含)到 endInclusive(含)的顺序有序 IntStream,增量为 1。

    public static IntStream rangeClosed(int startInclusive, int endInclusive)
    

    【讨论】:

    • 是的,这也有效。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多