【问题标题】:2D Array in KotlinKotlin 中的二维数组
【发布时间】:2015-12-07 23:44:32
【问题描述】:

如何在 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);

【问题讨论】:

    标签: arrays kotlin


    【解决方案1】:

    您可以将这行代码用于整数数组。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我基本上是在创建 n 个一维数组并将它们附加到另一个数组中以创建一个二维数组?
      【解决方案3】:

      简答:

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

      【讨论】:

      • 无限大小怎么样?
      • 我如何插入数据?我试试 m[0][0]=
      • 谢谢!这样一个简单的问题花费了太多时间。完美的。从现在开始我将使用它。
      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        1.嵌套的arrayOf 调用

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

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

        注意IntArray 本身只接受Int 类型的参数作为参数,所以你不能有IntArray&lt;IntArray&gt;,这显然没有多大意义。

        2。重复逻辑使用Array::constructor(size: Int, init: (Int) -&gt; T)

        如果您想根据索引创建具有某些逻辑行为的内部数组,您可以使用 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]]
        

        【讨论】:

          【解决方案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)
          )
          

          【讨论】:

          • 你很完美:-)
          【解决方案7】:

          您可以为此目的使用简单的一维(线性)数组。例如,这是我的 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)")
                  }
              }
          }
          

          【讨论】:

            【解决方案8】:
            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()
                }
            
            
            }
            

            它是这样工作的:

            【讨论】:

              【解决方案9】:

              使用内联函数和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")
              
                ... 
              

              【讨论】:

                【解决方案10】:

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

                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)
                

                【讨论】:

                  【解决方案11】:

                  您可以在 kotlin 中创建二维数组。

                              var twoDarray = Array(8) { IntArray(8) }
                  

                  这是一个int 2D数组的例子

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2019-07-18
                    • 1970-01-01
                    • 2018-05-02
                    • 2015-04-17
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-01-19
                    • 1970-01-01
                    相关资源
                    最近更新 更多