使用Kotlin中的foreach循环遍历BigInteger值

问题描述 投票:2回答:1

我试图使用以下代码片段在BigInteger上循环Kotlin值。但它告诉For-loop range must have an 'iterator()' method。如何在BigInteger中循环Kotlin值?

private fun pow(base: BigInteger, power: BigInteger): String {
        for(i in BigInteger.ZERO..power){ //Giving error

        }
    }
kotlin
1个回答
6
投票

您可以扩展BigInteger以允许此操作

特别是我们需要:

  1. rangeTo函数引入BigInteger(允许使用.. operator
  2. iterator函数添加到rangeTo operator返回的范围内

rangeTo功能

在这里,我为extension function定义了一个BigInteger

operator fun BigInteger.rangeTo(other: BigInteger) = 
        BigIntegerRange(this, other)

BigIntegerRange

class BigIntegerRange(
        override val start: BigInteger,
        override val endInclusive: BigInteger
) : ClosedRange<BigInteger>, Iterable<BigInteger> {
    override operator fun iterator(): Iterator<BigInteger> =
            BigIntegerRangeIterator(this)
}

BigIntegerRangeIterator

class BigIntegerRangeIterator(
        private val range: ClosedRange<BigInteger>
) : Iterator<BigInteger> {
    private var current = range.start

    override fun hasNext(): Boolean =
            current <= range.endInclusive

    override fun next(): BigInteger {
        if (!hasNext()) {
            throw NoSuchElementException()
        }
        return current++
    }
}

现在这段代码:

fun main() {
    for (i in BigInteger.ZERO..BigInteger.TEN) {
        println(i)
    }
}

编译和打印:

0
1
2
3
4
5
6
7
8
9
10

不要忘记import rangeTo功能

也可以看看:

© www.soinside.com 2019 - 2024. All rights reserved.