Kotlin中的2D阵列

时间:2015-12-07 23:44:32

标签: arrays kotlin

如何在Kotlin中制作2D 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);

这是我试过的一次尝试,其中第一个2D数组不起作用,但我让1D数组工作:

    //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);

10 个答案:

答案 0 :(得分:26)

您正在尝试将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)

答案 1 :(得分:23)

您可以将此行代码用于Integer数组。

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

这行代码非常简单,就像一维数组一样,也可以像java二维数组一样访问。

答案 2 :(得分:2)

1。嵌套的arrayOf通话

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

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

请注意,IntArray本身仅将类型为Int的参数用作参数,因此您不能拥有显然显然没有多大意义的IntArray<IntArray>

2。将Array::constructor(size: Int, init: (Int) -> T)用于重复的逻辑

如果要基于索引创建具有某些逻辑行为的内部数组,则可以使用带有大小和init块的Array构造函数:

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]]

答案 3 :(得分:1)

您似乎正在尝试在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)
)

答案 4 :(得分:1)

我在创建矩阵时一直使用这种单线纸

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

答案 5 :(得分:1)

使用内联功能和配对

  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")

  ... 

答案 6 :(得分:0)

您可以为此使用简单的1D(线性)阵列。例如,这是我的Double值矩形数组的类:

/**
 * 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)")
        }
    }
}

答案 7 :(得分:0)

简短答案:

// 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方法用于初始化。

答案 8 :(得分:0)

您可以创建两个一维数组并将其添加到新数组中。

val unChecked = intArrayOf(-android.R.attr.state_checked)
val checked = intArrayOf(android.R.attr.state_checked)
val states = arrayOf(unChecked, checked)

val thumbColors = intArrayOf(Color.WHITE, Color.parseColor("#55FFD4"))
val stateList = ColorStateList(states, thumbColors)

答案 9 :(得分:0)

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