创建一个 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);简单地称他们为例如min
和 max
会更简单易读。 (如果您将类型从 Int
更改为 Long
或其他任何类型,它也不需要重命名。)
当然,在生产代码中你可能根本不需要这个 class,因为 IntRange
就可以了。如果您 确实 需要自己的 class,我会非常认真地考虑是否真的需要 getNumbers()
方法,因为几乎肯定会有更好的方法没有创建临时数组,例如通过使用访问者模式。
大家好,感谢您的宝贵时间! 我这里有个问题。简而言之,我想创建一个 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);简单地称他们为例如min
和 max
会更简单易读。 (如果您将类型从 Int
更改为 Long
或其他任何类型,它也不需要重命名。)
当然,在生产代码中你可能根本不需要这个 class,因为 IntRange
就可以了。如果您 确实 需要自己的 class,我会非常认真地考虑是否真的需要 getNumbers()
方法,因为几乎肯定会有更好的方法没有创建临时数组,例如通过使用访问者模式。