创建一个类,创建元素位于两个参数(intStart, intent)之间的Int数组



大家好,谢谢大家!我有个问题。简而言之,我想创建一个类,它的实例在这个类的两个参数之间存储数据。类似于"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

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

问题是您的getNumbers()函数总是至少调用自己一次。它叫自己。它叫自己。它会调用自己,所以它会陷入无穷无尽的嵌套调用中,然后耗尽堆栈空间来存储它们。

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

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

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构造函数的init参数,可以编写得更简单(并且稍微更有效):

override fun getNumbers() = Array(intMax - intMin + 1){
it + intMin
}

在变量名中包含类型也是不常见的(并且可以说不是一个好主意);简单地称它们为minmax会更简单,更容易阅读。(如果将类型从Int更改为Long或其他类型,也不需要重命名。)

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

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)

相关内容

  • 没有找到相关文章

最新更新