在Kotlin中,我如何获取数组的前n个元素

时间:2018-02-07 15:57:06

标签: kotlin

在Kotlin中,如何获取此数组的前n个元素:

val allColours = arrayOf(
    Pair(Color.RED, Color.WHITE), 
    Pair(Color.RED, Color.BLACK), 
    Pair(Color.YELLOW, Color.BLACK), 
    Pair(Color.GREEN, Color.WHITE), 
    Pair(Color.BLUE, Color.WHITE), 
    Pair(Color.BLUE, Color.WHITE), 
    Pair(Color.CYAN, Color.BLACK), 
    Pair(Color.WHITE, Color.BLACK))

那么如何用{3}对第一个填充pegColours

var pegColours: Array<Pair<Color,Color>> = //???

我尝试了allColours.take,但却出错了:

  

期待元素

4 个答案:

答案 0 :(得分:7)

您使用Int s(allColours的颜色常量创建对的代码的问题具有Array<Pair<Int, Int>>)类型,但您期望Array<Pair<Color, Color>>。您需要什么do是更改类型pegColours类型并使用take

var pegColours: Array<Pair<Int, Int>> = allColours.take(3).toTypedArray() 

此外,您必须致电toTypedArray()因为Array.take返回List而不是Array。或者您可以更改pegColours类型,如下所示:

var pegColours: List<Pair<Int, Int>> = allColours.take(3)

答案 1 :(得分:6)

您需要指定要拍摄的项目数。

allColours.take(3)

对于随机数的随机索引,您可以使用以下内容:

val indexes = arrayOf(2, 4, 6)
allColours.filterIndexed { index, s -> indexes.contains(index) }

请注意,您可以为此编写扩展方法:

fun <T> Array<T>.filterByIndices(vararg indices: Int) = filterIndexed { index, _ -> indices.contains(index) }

或者,如果索引是连续的,则可以使用slice:

allColours.slice(1..3)

答案 2 :(得分:3)

我知道您已经提议使用take,但范围和简单的map也有助于编写惯用代码,如下所示:

var pegColours = (0 until 3).map { allColours[it] }.toTypedArray()

答案 3 :(得分:1)

你非常接近:)

val allColours = arrayOf("red", "blue", "green")
kotlin.io.println(allColours.take(2))

会给你前两个元素[“红色”,“蓝色”]

您必须指定要从数组中获取的元素数