Kotlin中的二维数组

106
如何在Kotlin中创建一个二维Int数组?我正在尝试将这段代码转换为Kotlin:
int[][] states = new int[][] {
      new int[]{-android.R.attr.state_pressed}, // not pressed
      new int[] { android.R.attr.state_pressed}  // pressed
};
int[] colors = new int[] {
      foregroundColor,
      accentColor,
      accentColor
};
ColorStateList myList = new ColorStateList(states, colors);

我尝试了一种方法,第一个二维数组不能正常工作,但我成功使用了一个一维数组:

//This doesn't work:
var states: IntArray = intArrayOf(
    intArrayOf(-android.R.attr.state_pressed), // not pressed
    intArrayOf(android.R.attr.state_pressed)  // pressed
);
//This array works:
var colors: IntArray = intArrayOf(
    foregroundColor,
    accentColor,
    accentColor
);
val myList: ColorStateList = ColorStateList(states, colors);
11个回答

118

您可以使用此行代码来创建一个整数数组。

val array = Array(row) { IntArray(column) }

这行代码非常简单,像1D数组一样工作,并且也可以像Java 2D数组一样访问。


1
这个很好用,如果你想创建一个带有 null 值的二维数组,可以使用以下代码 -> val array = Array(row) { arrayOfNulls<Int>(column) } - MrVasilev
1
这里的 rowcolumn 是你的二维数组中行数和列数的数量。 - Codextor

80

您试图将IntArrays放入另一个数组中以使其成为二维数组。该数组的类型不能为intArray,这就是为什么会失败的原因。 请改用arrayOf而不是intArrayOf来包装您的初始数组。

val even: IntArray = intArrayOf(2, 4, 6)
val odd: IntArray = intArrayOf(1, 3, 5)

val lala: Array<IntArray> = arrayOf(even, odd)

2
我基本上正在创建n个1D数组,并将它们附加到另一个数组中以制作2D数组? - Cyril

50
简短回答:
// A 6x5 array of Int, all set to 0.
var m = Array(6) {Array(5) {0} }

这是另一个例子,更详细地说明了正在发生的事情:
// a 6x5 Int array initialise all to 0
var m = Array(6, {i -> Array(5, {j -> 0})})

第一个参数是大小,第二个lambda方法是用于初始化。
这仅适用于对象类型数组,根据Kotlin文档,性能会受到影响,因为原始类型被装箱为对象,为了避免自动装箱,请使用原始类型数组

无限大小怎么办? - Thanasis
1
我该如何插入数据呢? 我尝试使用 m[0][0]= - tedris
1
谢谢!这个看似简单的问题花了太多时间。完美,我从现在开始会一直使用它。 - Alex.Gunning

29

在创建矩阵时,我一直使用这个单行代码。

var matrix: Array<IntArray> = Array(height) { IntArray(width) }

17

1. 嵌套的arrayOf调用

您可以嵌套调用arrayOf,例如,要创建一个IntArray数组,请执行以下操作:

val first: Array<IntArray> = arrayOf(
    intArrayOf(2, 4, 6),
    intArrayOf(1, 3, 5)
)

请注意,IntArray 只接受类型为 Int 的参数作为参数,因此您不能拥有一个明显没有任何意义的 IntArray<IntArray>
2. 如果您想要根据索引使用某些逻辑行为来创建内部数组,则可以利用带有大小和 init 块的 Array 构造函数:请使用 Array::constructor(size: Int, init: (Int) -> T) 来进行重复的逻辑处理。
val second: Array<IntArray> = Array(3) {
    intArrayOf(it * 1, it * 2, it * 3, it * 4)
} 
//[[0, 0, 0, 0], [1, 2, 3, 4], [2, 4, 6, 8]]

6

看起来您正在尝试在 Kotlin 中创建 ColorStateList。代码有些混乱,但我会尽力保持可读性:

val resolvedColor = Color.rgb(214, 0, 0)
val states = arrayOf(
    intArrayOf(-android.R.attr.state_pressed),
    intArrayOf(android.R.attr.state_pressed)
)

val csl = ColorStateList(
    states,
    intArrayOf(resolvedColor, Color.WHITE)
)

3
你可以使用简单的一维(线性)数组来实现这个目的。例如,这是我的一个矩形双精度值数组的类:

你可以使用简单的一维(线性)数组来实现这个目的。例如,这是我的一个矩形双精度值数组的类:

/**
 * Rect array of Double values
 */
class DoubleRectArray(private val rows: Int, private val cols: Int) {
    private val innerArray: DoubleArray

    init {
        if(rows < 1) {
            throw IllegalArgumentException("Rows value is invalid. It must be greater than 0")
        }

        if(cols < 1) {
            throw IllegalArgumentException("Cols value is invalid. It must be greater than 0")
        }

        innerArray = DoubleArray(rows*cols)
    }

    /**
     *
     */
    fun get(row: Int, col: Int): Double {
        checkRowAndCol(row, col)
        return innerArray[row*cols + col]
    }

    /**
     *
     */
    fun set(row: Int, col: Int, value: Double) {
        checkRowAndCol(row, col)
        innerArray[row*cols + col] = value
    }

    /**
     *
     */
    private fun checkRowAndCol(row: Int, col: Int) {
        if(row !in 0 until rows) {
            throw ArrayIndexOutOfBoundsException("Row value is invalid. It must be in a 0..${rows-1} interval (inclusive)")
        }

        if(col !in 0 until cols) {
            throw ArrayIndexOutOfBoundsException("Col value is invalid. It must be in a 0..${cols-1} interval (inclusive)")
        }
    }
}

虽然令人沮丧,但这似乎是处理Kotlin中的二维数组的唯一合理方式,而且我甚至在标准库中都找不到这个功能。我的感觉是建议任何人不要在数据科学、科学计算、统计学、机器学习等领域使用Kotlin。 - ChrisoLosoph

2
你可以在Kotlin中创建二维数组。
            var twoDarray = Array(8) { IntArray(8) }

这是一个 int 类型的二维数组示例


这不是一个一维数组吗?请解释一下。现在看起来非常奇怪。 - undefined

2
package helloWorld

import java.util.Scanner

fun main(){
    val sc = Scanner(System.`in`)
    print("ENTER THE SIZE OF THE ROW: ")
    var row = sc.nextInt()
    println()
    print("ENTER THE SIZE OF COLUMN: ")
    val column = sc.nextInt()
    println()
    var a = Array(row){IntArray(column)}
    for(i in 0 until row){
        when (i) {
            0 -> {
                println("----------${i+1} st ROW'S DATA----------")
            }
            1 -> {
                println("----------${i+1} nd ROW'S DATA----------")
            }
            2 -> {
                println("----------${i+1} rd ROW'S DATA----------")
            }
            else -> {
                println("----------${i+1} th ROW'S DATA----------")
            }
        }
        for(j in 0 until column)
        {
            print("ENTER ${j+1} COLUMN'S DATA: ")
            var data:Int = sc.nextInt()
            a[i][j]=data;
        }
        println()
    }
    println("COLLECTION OF DATA IS COMPLETED")
    for(i in 0 until row){
        for(j in 0 until column){
            print(a[i][j])
            print(" ")
        }
        println()
    }


}

它的工作原理如下:

enter image description here


1
使用内联函数和Pair:
  inline fun<reified T> Pair<Int,Int>.createArray(initialValue:T) = Array(this.first){ Array(this.second){initialValue}}

  // Create m*n Array of Ints filled with 0
  val twoDimArray = Pair(10,20).createArray(0)

  // Create m*n Array of Doubles filled with 0.0
  val twoDimArray = Pair(10,20).createArray(0.0)

  // Create m*n Array of Strings filled with "Value"
  val twoDimArray = Pair(10,20).createArray("Value")

  ... 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接