我正在学习Kotlin,而我正试图解开Ranges
我创建了一系列String
,如下所示
val alpha = "A".."Z"
我想为我写的那个打印
for (item in alpha) println(item)
但它给出了错误
错误:(13,18)Kotlin:For循环范围必须有一个' iterator()'方法
任何人都可以提供帮助,如何打印此范围?
答案 0 :(得分:2)
默认情况下,您无法使用String
来执行此操作,因为iterator()
没有ClosedRange<String>
,但Char
可以直接使用:
val r = 'A'..'Z'
r.forEach(::println)
它将是CharRange
类型,并提供所需的iterator()
。
要使您的特殊示例与String
一起使用,您可以定义自己的扩展功能并委托给Iterator<Char>
:
operator fun ClosedRange<String>.iterator(): Iterator<String> {
val charIt = (start.toCharArray().first()..endInclusive.toCharArray().first()).iterator()
return object : Iterator<String> {
override fun hasNext() = charIt.hasNext()
override fun next(): String = charIt.nextChar().toString()
}
}
现在按你的意愿工作。但请注意,对于范围为String
的大多数用例,这没有意义。
答案 1 :(得分:0)
如何打印此范围?
我认为打印此范围的唯一方法是
println(alpha)
你会得到
A..Z
这是&#34; print&#34;这个范围。
您尝试在不可互换的范围内旅行,这是无效的
比如,你不能for (i in File("a.txt")..File("Main.java")) println(i)
。
答案 2 :(得分:0)
val alpha = "A".."Z"
这是一个简单的范围,这意味着它是整个订单中连续子集的抽象表示。这样一个实体支持的唯一操作是回答“这个范围内的这个元素是什么吗?”这个问题,它将完全基于Comparable<T>
的契约。
在您的情况下,请考虑使用"THREAD"
之类的字符串。它属于你的范围吗?它排序高于"A"
但低于"Z"
,因此它确实属于它。但是你可能不打算迭代它,或者属于你范围的所有其他字符串的无穷大。
您认为给定的实际上是一种特殊情况:可迭代范围。它们仅在表示整数类型的三种类型上定义:IntRange
,LongRange
和CharRange
。这些是属于该范围的子集实际上可以枚举和迭代的类型。
答案 3 :(得分:0)
你能试试这个可以帮助你,我想你真的想要&#39; A&#39; Z&#39; Z&#39;不是&#34; A&#34; ..&#34; Z&#34;
var A = 'A'..'Z'
for(value in A){
println("$value")
}
答案 4 :(得分:0)
我喜欢@ s1m0nw1和@Marko Topolnik的答案。
您不能真正遍历ClosedRange
该文字可能会误导我们认为这是一个ClosedRange
var range = "A".."C" // misleading literal
您可以做什么: 只是一小部分:将字符映射到字符串
val r = ('A'..'Z').map { it.toString() }//.forEach(::println)
for (letter in r){
}