Kotlin:按相反顺序遍历数组

Kotlin:按相反顺序遍历数组,kotlin,Kotlin,在Kotlin中是否有一种方便的方法可以在以下两种情况下以相反的顺序遍历数组,比如说IntArray: 请勿创建阵列的其他反向副本 我需要一个元素的句柄,如Java的增强版for中的元素 我所能得到的最好结果是添加一个扩展函数,但如果我不仅需要IntArrays,还需要为每种类型的数组添加扩展函数: fun IntArray.forEachReversed(action: (Int) -> Unit): Unit { for (i in indices.reversed())

在Kotlin中是否有一种方便的方法可以在以下两种情况下以相反的顺序遍历数组,比如说
IntArray

  • 请勿创建阵列的其他反向副本
  • 我需要一个元素的句柄,如Java的增强版
    for
    中的元素
我所能得到的最好结果是添加一个扩展函数,但如果我不仅需要
IntArray
s,还需要为每种类型的数组添加扩展函数:

fun IntArray.forEachReversed(action: (Int) -> Unit): Unit {
    for (i in indices.reversed()) action(this[i])
}
在Kotlin类库中有更好的方法吗

如果我不仅需要Intarray,还需要为每种类型的阵列执行此操作:

我认为这是不可避免的,因为JVM的工作方式。JVM上有单独的类来表示每个基元类型。但是,它们只有8个,所以应该不会太糟糕;-)

对于集合,有函数,但不适用于数组:

val original=mutableListOf('a','b','c','d','e'))
val originalReadOnly=原始as列表
val reversed=originalReadOnly.asReversed()
println(原件)/[a、b、c、d、e]
println(反向)/[e,d,c,b,a]
//更改原始列表会影响其反向视图
原件。添加('f')
println(原件)/[a、b、c、d、e、f]
println(反向)/[f,e,d,c,b,a]

为了回答您的问题,您的解决方案看起来不错,但如果您的目标是基元
IntArray
LongArray
FloatArray
等,则您不能提供通用解决方案,因为此类是独立的,唯一常见的是
迭代器,但是,如果不进行复制,就不能以相反的顺序遍历
迭代器
ListIterator
支持反向迭代),但最接近的方法是使用
Array
而不是下面这样的特定数组

 fun <T> Array<T>.forEachReversed(action: (T) -> Unit){
    for(i in indices.reversed()){  action(this[i]) }
 }
 
 val intArray = Array(2){ 0 }
 val longArray = Array<Long>(2){ 0 }
 intArray.forEachReversed { }
 longArray.forEachReversed {  }
fun数组。forEachReversed(动作:(T)->Unit){
对于(索引中的i.reversed()){action(this[i])}
}
val intArray=数组(2){0}
val longArray=Array(2){0}
intArray.foreach{}
longArray.forEachReversed{}

正如@ajan.kali所指出的,如果您需要基本数组,那么您所能做的并不多。我想您必须处理数组,但如果不是这样,您应该更喜欢其他数据结构(更多信息) 回到您的问题,如果您可以使用泛型数组,您可能可以声明您的迭代器以相反顺序进行迭代:

class ReverseIterator<T>(val it: Iterable<T>) : Iterator<T> {
   private var index = it.count() - 1 
   override fun hasNext() = index >= 0  
   override fun next(): T = try { it.elementAt(index--) } catch (e: 
   IndexOutOfBoundsException) { index -= 1; throw 
     NoSuchElementException(e.message) }
}

对此并不特别满意,但对于数组,除了避免它们之外,您无法做太多其他事情。

asReversed
不会创建副本吗?现在无法访问IDE进行检查。查看,它使用索引的反向副本。为t添加不是什么大问题。它只是其他类的一个方法。问题是,是否有更好的方法来做到这一点。
class ReverseIterator<T>(val it: Iterable<T>) : Iterator<T> {
   private var index = it.count() - 1 
   override fun hasNext() = index >= 0  
   override fun next(): T = try { it.elementAt(index--) } catch (e: 
   IndexOutOfBoundsException) { index -= 1; throw 
     NoSuchElementException(e.message) }
}
fun <T> Iterable<T>.forEachReversed(action: (T) -> Unit) {   
   for(elem in ReverseIterator(this)) {
      action(elem)
   }
}
intArrayOf(1, 2, 3).asIterable().forEachReversed { 
  println(it)
}