【问题标题】:Create and Append list based on other list member in Scala基于Scala中的其他列表成员创建和附加列表
【发布时间】:2017-03-13 18:05:50
【问题描述】:

我有这样的整数列表:

val aRowcol: List[List[Int]]] = 
List(List(0, 0), List(0, 1), List(0, 2)),
List(List(1, 0), List(1, 1), List(1, 2)),
List(List(2, 0), List(2, 1), List(2, 2)),
List(List(0, 0), List(1, 1), List(2, 2)),
List(List(2, 0), List(1, 1), List(0, 2)),
List(List(1, 0), List(0, 1), List(0, 2)),
List(List(1, 0), List(2, 1), List(2, 2))

val aAlpha: List[List[String]] = List(
List("a","b","c","d"),
List("e","f","g","h"),
List("i","j","k","l","m"))

val i = 4
val resNum:List[List[Int,String]] = (0 to i) {
        _map => List(
        aRowcol.take(i).head.head,
        aRowcol.take(i).head(1),
        aAlpha(aRowcol.take(i).head.head)(aRowcol.take(i).head(1))}
        .toList

但我想要的 val resNum 的结果是:

List( List(0,0,"a"), List(1,0,"e"), List(2,0,"i"), List(0,0,"a"), List(2,0,"i"))

(0,0) 表示第一行第一列,我们在那个位置有“a”,所以i 将定义我们将拥有多少aAlpha。我认为如果我们使用i++ 会容易得多,但你知道we couldn't do i++ in scala.

【问题讨论】:

  • 您能更好地阐明您想要实现的目标吗?我无法弄清楚这里的逻辑。加号 - list.take(i).head 等价于 list.head,因为 take(n) 返回前 n 个项目,head 返回第一个 - 所以“前 n 个中的第一个”与“第一个”相同
  • 那么aRowcol 应该是List[List[List[Int]]] 吗?您的示例代码无法编译...
  • 我在代码示例中没有看到aNumber list
  • 请解释您的用例以及您想在这里做什么?

标签: scala list foreach filter append


【解决方案1】:

猜测您想将aRowcol 中每个“列表列表”中的 first 元素视为@ 中字母的“坐标” 987654322@,并希望将该字母附加到这些“第一个元素”中的每一个。

如果是这样:

val result: List[List[Any]] = aRowcol.take(5) // only 5 first rows 
  .map(_.head)   // first List(i, j) only, the rest is ignored
  .map { case List(i, j) => List(i, j, aAlpha(i)(j)) } // append the right letter to list

result.foreach(println)
// List(0, 0, a)
// List(1, 0, e)
// List(2, 0, i)
// List(0, 0, a)
// List(2, 0, i)

如果这不是你的意思 - 请澄清。

编辑:至于您的版本 - 它可以通过一些修复工作(并实现相同的目标):

  • list.take(i) 不返回第 i 个元素,它返回一个 包含前 i 个元素的列表,我认为您正在尝试使用返回第 i 个元素的 list.apply(i),或者这是简写​​版本:list(i)
  • 如果您想映射数字 0..4 - 调用 map 然后命名您传递的匿名函数的 参数 i - 不要使用 var 声明在方法之外并期望它增加

通过这些更正(以及更多),您的版本变为:

val resNum: List[List[Any]] = (0 to 4).map { i =>
  List(
    aRowcol(i).head.head,
    aRowcol(i).head(1),
    aAlpha(aRowcol(i).head.head)(aRowcol(i).head(1))) }
  .toList

如您所愿;但上面是一个类似但更简单的版本。

【讨论】:

  • 谢谢@Tzach 让我试试。
  • 如果我们使用for (i <- 1 to 4),你认为i会返回吗??
  • 也取5表示列表编号(0到4)不是吗?
  • 不确定我是否理解这个问题...为什么需要它? map 现有集合(即在 aRowcol 中的前 5 个项目上调用 map)然后创建这些索引变量要容易得多(而且效率更高!)。 aRowcol.take(5) 不创建任何索引或数字列表,它只是创建原始子列表的子列表,并对其进行映射为您提供所需的内容。
  • 确保您的回答是最有效的方法。我只想知道for 是否也可用于这种情况。现在我明白了为什么我们在许多 scala 案例中不使用 for
猜你喜欢
  • 2021-09-17
  • 1970-01-01
  • 2013-06-08
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
相关资源
最近更新 更多