Kotlin集合中的元素组合

我不是普通的StackOverflow用户,既不是贡献者,也不是提出问题。 但是,我最近偶然发现了一个问题 ,试图提供帮助...并失败了。 有人指出我的答案是错误的-感谢所有这样做的人。 我认为失败是学习新事物的好时机!

在这篇文章中,我想详细介绍我进一步研究后学到的知识:有几种方法可以将Kotlin stdlib中现有集合中的元素进行组合。

与下一个结合

第一组合功能是将一个元素与另一个元素成对关联。

签名是:

fun<T>Iterable<T>.zipWithNext():List<Pair<T,T>>

这是一个有关如何使用它的简单示例:

valelements=listOf("A","B","C","D","E","F","G","H")

elements.zipWithNext().forEach{
    print(it)
}

它将输出:

(A, B)(B, C)(C, D)(D, E)(E, F)(F, G)(G, H)

zipWithNext另一种风味是:

fun<T,R>Iterable<T>.zipWithNext(
    transform:(a:T,b:T)->R
):List<R>

这允许在对上运行转换函数, 例如

elements.zipWithNext{first,second->
        "$first$second "
    }.forEach{
        print(it)
    }

相应的输出是:

AB BC CD DE EF FG GE

使用块结合

第二个合并功能是合并特定大小的块中的元素:

fun<T>Iterable<T>.chunked(size:Int):List<List<T>>

使用方法如下:

elements.chunked(2).forEach{
        print(it)
    }

它产生以下内容:

[A, B][C, D][E, F][G, H]

至于先前的功能,使用转换功能还有一种替代方法:

fun<T,R>Iterable<T>.chunked(
    size:Int,
    transform:(List<T>)->R
):List<R>

使用它非常简单:

elements.chunked(3){
        print("${it.joinToString("")} ")
    }

结果是:

ABC DEF GH
最后一块的大小可能与常规块的大小不同。 如果集合大小除以块大小的余数不为0,就是这种情况。

使用滑动窗组合

最终的合并功能在集合中的元素上使用一个滑动窗口。 参数包括窗口“ width”和滑动“ step”:

fun<T>Iterable<T>.windowed(
    size:Int,
    step:Int=1,
    partialWindows:Boolean=false
):List<List<T>>

这是前两个功能的概括:

  1. zipWithNext == windowed(2, 1)
    略有不同,因为zipWithNext()返回Pair,而windowed()返回List确切的等效项应该是:zipWithNext()。map {listOf(it.first,it.second)} = windowed(2,1)
  2. chunked(x) == windowed(x, x, true)

作为前两个功能, windowed还提供了转换风格。

更进一步:

翻译自: https://blog.frankel.ch/elements-combination-kotlin-collections/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值