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

Dav*_*ers 7 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))
Run Code Online (Sandbox Code Playgroud)

那么如何填写pegColours第一个说3对呢?

var pegColours: Array<Pair<Color,Color>> = //???
Run Code Online (Sandbox Code Playgroud)

我试过了,allColours.take但它给出了一个错误:

期待一个元素

hlu*_*kyi 9

您使用颜色常量创建的代码的问题是Ints(allColours具有类型Array<Pair<Int, Int>>),但您期望Array<Pair<Color, Color>>.您需要做的是更改类型pegColours类型并使用take:

var pegColours: Array<Pair<Int, Int>> = allColours.take(3).toTypedArray() 
Run Code Online (Sandbox Code Playgroud)

你还必须调用toTypedArray()原因Array.take返回List而不是Array.或者您可以更改pegColours类型如下:

var pegColours: List<Pair<Int, Int>> = allColours.take(3)
Run Code Online (Sandbox Code Playgroud)


s1m*_*nw1 7

我知道你已经建议使用take, 但或者range 和一个简单的map也有助于编写惯用代码,如下所示:

var pegColours = (0 until 3)
    .map { allColours[it] }
    .toTypedArray()
Run Code Online (Sandbox Code Playgroud)


m0s*_*it0 6

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

allColours.take(3)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

allColours.slice(1..3)
Run Code Online (Sandbox Code Playgroud)

  • @Morozov` .filterIndexed {index,_-> index%2 == 0 && index!= 0} .take(3)` (3认同)