【问题标题】:Scala: using map to extract secondary tuple values from a listScala:使用映射从列表中提取二级元组值
【发布时间】:2018-02-28 18:33:40
【问题描述】:

我的问题如下:

我有一个特定类型的列表,我们称之为AAA(name:String, value: Int) 定义。

这将使我的列表看起来像[("a", 10) ("b", 12) ("c" 14)]

现在我想使用映射函数来仅提取辅助值。即构造一个新的值列表[10,12,14]。我已经尝试了一个多小时,但似乎无法使其正常工作。

我已经尝试在地图函数中使用模式匹配并尝试获取第二个元素,即:

myList.map(_.value) 

myList.map(_.2) 

但似乎无法正常工作。

【问题讨论】:

  • 如果这些确实是元组(而不是像 A 这样的案例类的实例) - 使用 myList.map(_._2)
  • @TzachZohar 是正确的,如果您的数据结构是 Tuple,但您在此处显示数据类 A(name:String, value: Int) 会让工程师感到困惑。
  • 您说问题已解决,但没有一个答案被接受,甚至没有被投票。这不是对 SO 表示感谢的方式。
  • 是的,同意@jwvh。如果两个答案都没有解决您的问题,请给出一个自我答案(或者您是否需要更多的声誉才能这样做?)。但是,如果一个答案解决了您的问题,请接受它作为答案,并对每个答案进行投票,您认为这很好。它比编辑问题花费更少,并且系统不会将您的编辑识别为“已解决”。但它会识别“接受的答案”(问题列表中的彩色答案计数器)。顺便说一句:我们避免在这里打招呼,“提前谢谢”,“请帮帮我”之类的。并且“已解决”消息污染了自动生成的摘录 - 另一点反对。

标签: scala tuples mapping


【解决方案1】:

如果你的数据结构是case class,那么你所做的是正确的,

scala> case class Data(name:String, value: Int) 
// defined case class Data
scala> Seq(Data("a", 1), Data("b", 2), Data("c", 3)).map(_.value) 
val res6: Seq[Int] = List(1, 2, 3)

但如果它不是一个数据类而是一个元组,那么你将不得不使用tuple._2 或使用下面的模式匹配来获取第二个元素

scala> Seq(("a", 1), ("b", 2), ("c", 3)).collect {case (name, value) => value } 
res7: Seq[Int] = List(1, 2, 3)

另请阅读syntax for scala tuple

【讨论】:

    【解决方案2】:

    如果你的列表是Tuple2

    val list = List(("a", 10), ("b", 12), ("c", 14))
    //list: List[(String, Int)] = List((a,10), (b,12), (c,14))
    

    您必须使用方法_1 访问第一个元素,_2 访问第二个元素,依此类推。所以做以下应该可以解决

    list.map(_._2)
    //res0: List[Int] = List(10, 12, 14)
    

    但如果将其定义为case class

    case class A(name:String, value: Int)
    //defined class A
    
    val list = List(A("a", 10), A("b", 12), A("c", 14))
    //list: List[A] = List(A(a,10), A(b,12), A(c,14))
    

    那你的方法是对的

    list.map(_.value)
    //res0: List[Int] = List(10, 12, 14)
    

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-11
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      相关资源
      最近更新 更多