gpt4 book ai didi

scala - 如何在 Scala 中将字符串列表转换为另一种形式?

转载 作者:行者123 更新时间:2023-12-05 03:13:00 24 4
gpt4 key购买 nike

我有一个采用以下形式的字符串列表:

000000
011220
011220
033440
033440
000000

我想将这些字符串转换为表示每个 2x2 block 的值列表,同时保留行信息。表示每个 2x2 block 的数据是存储在列表还是元组中是无关紧要的。例如,表示左上角的 2x2 block 可以采用以下形式之一:

(0, 0, 0, 1)

List((0, 0), (0, 1))

List(0, 0, 0, 1)

List(List(0, 0), List(0, 1))

下面的 Scala 代码执行规定的转换,但它似乎过于复杂。我可以将一些功能分解成单独的函数,但我看不出如何将这段代码转换成更简单的形式,如 for-comprehension。

NOTE: I've simplified the list of values for brevity.

scala> val data = List("000000", "011220", "033440")
data: List[String] = List(000000, 011220, 033440)

scala> val values = (data map { _.toList.sliding(2).toList } sliding(2) map { _.transpose } map { _ map { _.flatten } }).toList
values: List[List[List[Char]]] = List(List(List(0, 0, 0, 1), List(0, 0, 1, 1), List(0, 0, 1, 2), List(0, 0, 2, 2), List(0, 0, 2, 0)), List(List(0, 1, 0, 3), List(1, 1, 3, 3), List(1, 2, 3, 4), List(2, 2, 4, 4), List(2, 0, 4, 0)))

为清楚起见,我用“行”和“ block ”重新标记了一些列表,但它们不代表任何具体类。它们只是提供以上输出的更有意义 View 的绰号。

values: List[Row[Block[Char]]] = List(Row(Block(0, 0, 0, 1), Block(0, 0, 1, 1), ...), Row(Block(0, 1, 0, 3), Block(1, 1, 3, 3), ...))

我是 Scala 的新手,我想知道上面的代码是实现这种转换的好方法还是有更优雅的方法?

最佳答案

你可以这样做(.toList 本质上是用来查看结果的,而不是 non-empty iterator):

scala> val values = data.map(_.sliding(2).toList)  // create a sliding window over consecutive characters
.sliding(2).toList // slide over consecutive rows
.flatMap { case List(row1, row2) => row1 zip row2 } // zip rows together, creating the blocks
values: List[(String, String)] = List((00,01), (00,11), (00,12), (00,22),
(00,20), (01,03), (11,33), (12,34),
(22,44), (20,40))

关于scala - 如何在 Scala 中将字符串列表转换为另一种形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31411026/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com