在Kotlin中创建通用的二维数组 [英] Create generic 2D array in Kotlin

查看:6823
本文介绍了在Kotlin中创建通用的二维数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个泛型类,并且需要一个泛型类型 T 的二维数组。如果我尝试以下操作:

  class Matrix< T>(width:Int,height:Int){
val data :Array< Array< T>> =数组(宽度,arrayOfNulls< T>(高度))
}

抛出一个错误说不能使用'T'作为实体类型参数,而是使用一个类。

解决方案

  class Array2D< t>< p> (val xSize:Int,val ySize:Int,val array:Array< Array< T>>){

伴随对象{

内嵌操作符fun< reified T> ; invoke()= Array2D(0,0,Array(0,{emptyArray< T>()}))

嵌入式运算符fun< tified T> invoke(xWidth:Int,yWidth:Int)=
Array2D(xWidth,yWidth,Array(xWidth,{arrayOfNulls< T>(yWidth)}))

内联操作符fun < T> invoke(xWidth:Int,yWidth:Int,运算符:(Int,Int) - >(T)):Array2D< T> {
val array = Array(xWidth,{
val x = it
Array(yWidth,{operator(x,it)})})
返回Array2D(xWidth,yWidth ,数组)
}
}

操作符fun get(x:Int,y:Int):T {
返回数组[x] [y]


operator fun set(x:Int,y:Int,t:T){
array [x] [y] = t
}

inline fun forEach(operation:(T) - > Unit){
array.forEach {it.forEach {operation.invoke(it)}}
}

inline fun forEachIndexed(operation:(x:Int,y:Int,T) - > Unit){
array.forEachIndexed {x,p - > p.forEachIndexed {y,t - > operation.invoke(x,y,t)}}
}
}

这也允许你以类似于1d数组的方式创建2d数组,例如类似于

  val array2D = Array2D< String>(5,5){x,y  - > $ x $ y} 

并使用索引操作符访问/设置内容:

  val xy = array2D [1,2] 


Suppose I have a generic class and I need a 2D array of generic type T. If I try the following

class Matrix<T>(width: Int, height: Int) {
    val data: Array<Array<T>> = Array(width, arrayOfNulls<T>(height))
}

the compiler will throw an error saying "Cannot use 'T' as reified type parameter. Use a class instead.".

解决方案

Just because the syntax has moved on a bit, here's my take on it:

class Array2D<T> (val xSize: Int, val ySize: Int, val array: Array<Array<T>>) {

    companion object {

        inline operator fun <reified T> invoke() = Array2D(0, 0, Array(0, { emptyArray<T>() }))

        inline operator fun <reified T> invoke(xWidth: Int, yWidth: Int) =
            Array2D(xWidth, yWidth, Array(xWidth, { arrayOfNulls<T>(yWidth) }))

        inline operator fun <reified T> invoke(xWidth: Int, yWidth: Int, operator: (Int, Int) -> (T)): Array2D<T> {
            val array = Array(xWidth, {
                val x = it
                Array(yWidth, {operator(x, it)})})
            return Array2D(xWidth, yWidth, array)
        }
    }

    operator fun get(x: Int, y: Int): T {
        return array[x][y]
    }

    operator fun set(x: Int, y: Int, t: T) {
        array[x][y] = t
    }

    inline fun forEach(operation: (T) -> Unit) {
        array.forEach { it.forEach { operation.invoke(it) } }
    }

    inline fun forEachIndexed(operation: (x: Int, y: Int, T) -> Unit) {
        array.forEachIndexed { x, p -> p.forEachIndexed { y, t -> operation.invoke(x, y, t) } }
    }
}

This also allows you to create 2d arrays in a similar manner to 1d arrays, e.g. something like

val array2D = Array2D<String>(5, 5) { x, y -> "$x $y" }

and access/set contents with the indexing operator:

val xy = array2D[1, 2]

这篇关于在Kotlin中创建通用的二维数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆