Kotlin 有没有一种更有效的方法以某种方式将项目列表映射到成对列表?

Kotlin 有没有一种更有效的方法以某种方式将项目列表映射到成对列表?,kotlin,collections,Kotlin,Collections,源数据:数组 目标返回数据:列表 源数据(数组)包含一本书的JPEG列表,格式为(Scan0001.jpg,Scan0002.jpg,…,Scan000n.jpg)。第一个文件(Scan0001.jpg)始终是本书的封面,最后一个文件(Scan000n.jpg)始终是本书的封底。以下代码段中的变量文件是一个数组,它只包含Scanxxxx.jpg格式的jpeg文件 我想按照以下规则创建页面的成对文件: 1) 封面(正面、背面)应始终成对(文件分别为Scan0001.jpg和Scan000n.jpg

源数据:数组

目标返回数据:列表

源数据(数组)包含一本书的JPEG列表,格式为(Scan0001.jpg,Scan0002.jpg,…,Scan000n.jpg)。第一个文件(Scan0001.jpg)始终是本书的封面,最后一个文件(Scan000n.jpg)始终是本书的封底。以下代码段中的变量文件是一个数组,它只包含Scanxxxx.jpg格式的jpeg文件

我想按照以下规则创建页面的成对文件:

1) 封面(正面、背面)应始终成对(文件分别为Scan0001.jpg和Scan000n.jpg)

2) 如果非封面不均匀(意味着最后一页没有一对),则应为一对(文件为Scan000n-1.jpg)

3) 封面应始终是第一对文件,封底应始终是最后一对文件

下面的代码可以工作,但我觉得在更高效或更干净的代码方面还有改进的空间

val files = selectedFolder.listFiles()
val preliminaryResult = files.toMutableList()
val result = mutableListOf<Pair<File?,File?>>()

result.add(Pair(preliminaryResult.first(),null))
preliminaryResult.removeAt(0)

result.add(Pair(preliminaryResult.last(),null))
preliminaryResult.removeAt(preliminaryResult.size-1)

result.addAll(preliminaryResult.map{
    if(preliminaryResult.indexOf(it) % 2 == 0) {
        Pair(it,preliminaryResult.getOrNull(preliminaryResult.indexOf(it)+1))
    } else {
        Pair(null,null)
    }
})

result.removeAll{
    it == Pair(null,null)
}

result.add(result[1])
result.removeAt(1)
val files=selectedFolder.listFiles()
val preliminaryResult=files.toMutableList()
val result=mutableListOf()
add(Pair(preliminaryResult.first(),null))
初步结果移除(0)
add(Pair(preliminaryResult.last(),null))
初步结果移除(初步结果尺寸-1)
result.addAll(preliminaryResult.map{
if(初始结果索引)(it)%2==0){
配对(it,preliminaryResult.getOrNull(preliminaryResult.indexOf(it)+1))
}否则{
对(空,空)
}
})
result.removeAll{
it==对(null,null)
}
结果。添加(结果[1])
结果。移除(1)

您可以先插入所需的空值,这样就可以不间断地使用
zipWithNext

val result = selectedFolder.listFiles().toMutableList<File?>().apply {
    add(1, null) // for front cover
    if (0 == size % 2)
        add(size - 1, null) // for odd inner last page
    add(null) // for back cover
}.zipWithNext()
    .run { slice(indices step 2) }
val result=selectedFolder.listFiles().toMutableList().apply{
添加(1,空)//用于前盖
如果(0==大小%2)
add(size-1,null)//用于奇数内部最后一页
添加(空)//用于后盖
}.zipWithNext()
.run{slice(索引步骤2)}

嘿,问题是,它会产生(A,B)、(B,C)、(C,D)等结果,因此每个页面都会出现两次。但是,通过将zipWithNext()替换为chunked(2).map{it[0]到它[1]},它会生成所需的结果。非常感谢。编辑:如果你编辑你的答案,我会把它标记为正确:)哦,对不起。我用不同的方式编辑了它。