大家好,谢谢大家!我有个问题。简而言之,我想创建一个类,它的实例在这个类的两个参数之间存储数据。类似于"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
}
在变量名中包含类型也是不常见的(并且可以说不是一个好主意);简单地称它们为min
和max
会更简单,更容易阅读。(如果将类型从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)