如何计算scala中元组中字符串的长度
How to calculate length of string in a tuple in scala
给定一个元组列表,其中元组的第一个元素是整数,第二个元素是字符串,
scala> val tuple2 : List[(Int,String)] = List((1,"apple"),(2,"ball"),(3,"cat"),(4,"doll"),(5,"eggs"))
tuple2: List[(Int, String)] = List((1,apple), (2,ball), (3,cat), (4,doll), (5,eggs))
我想打印对应字符串长度为4的数字。
可以一行完成吗?
你需要.collect
也就是filter+map
鉴于您的意见,
scala> val input : List[(Int,String)] = List((1,"apple"),(2,"ball"),(3,"cat"),(4,"doll"),(5,"eggs"))
input: List[(Int, String)] = List((1,apple), (2,ball), (3,cat), (4,doll), (5,eggs))
过滤掉长度为4的,
scala> input.collect { case(number, string) if string.length == 4 => number}
res2: List[Int] = List(2, 4, 5)
替代解决方案使用 filter
+ map
,
scala> input.filter { case(number, string) => string.length == 4 }
.map { case (number, string) => number}
res4: List[Int] = List(2, 4, 5)
你filter
和print
如下
tuple2.filter(_._2.length == 4).foreach(x => println(x._1))
你的输出应该是
2
4
5
使用a for理解如下,
for ((i,s) <- tuple2 if s.size == 4) yield i
上面的例子提供了
List(2, 4, 5)
请注意,我们进行模式匹配并提取每个元组中的元素并按字符串大小进行过滤。要打印列表,请考虑 aList.foreach(println)
.
我喜欢@prayagupd 使用collect 回答。但是 foldLeft 是我最喜欢的 Scala 函数之一!你可以使用 foldLeft:
scala> val input : List[(Int,String)] = List((1,"apple"),(2,"ball"),(3,"cat"),(4,"doll"),(5,"eggs"))
input: List[(Int, String)] = List((1,apple), (2,ball), (3,cat), (4,doll), (5,eggs))
scala> input.foldLeft(List.empty[Int]){case (acc, (n,str)) => if(str.length ==4) acc :+ n else acc}
res3: List[Int] = List(2, 4, 5)
这样做:
tuple2.filter(_._2.size==4).map(_._1)
在 Scala REPL 中:
scala> val tuple2 : List[(Int,String)] = List((1,"apple"),(2,"ball"),(3,"cat"),(4,"doll"),(5,"eggs"))
tuple2: List[(Int, String)] = List((1,apple), (2,ball), (3,cat), (4,doll), (5,eggs))
scala> tuple2.filter(_._2.size==4).map(_._1)
res261: List[Int] = List(2, 4, 5)
scala>
给定一个元组列表,其中元组的第一个元素是整数,第二个元素是字符串,
scala> val tuple2 : List[(Int,String)] = List((1,"apple"),(2,"ball"),(3,"cat"),(4,"doll"),(5,"eggs"))
tuple2: List[(Int, String)] = List((1,apple), (2,ball), (3,cat), (4,doll), (5,eggs))
我想打印对应字符串长度为4的数字。
可以一行完成吗?
你需要.collect
也就是filter+map
鉴于您的意见,
scala> val input : List[(Int,String)] = List((1,"apple"),(2,"ball"),(3,"cat"),(4,"doll"),(5,"eggs"))
input: List[(Int, String)] = List((1,apple), (2,ball), (3,cat), (4,doll), (5,eggs))
过滤掉长度为4的,
scala> input.collect { case(number, string) if string.length == 4 => number}
res2: List[Int] = List(2, 4, 5)
替代解决方案使用 filter
+ map
,
scala> input.filter { case(number, string) => string.length == 4 }
.map { case (number, string) => number}
res4: List[Int] = List(2, 4, 5)
你filter
和print
如下
tuple2.filter(_._2.length == 4).foreach(x => println(x._1))
你的输出应该是
2
4
5
使用a for理解如下,
for ((i,s) <- tuple2 if s.size == 4) yield i
上面的例子提供了
List(2, 4, 5)
请注意,我们进行模式匹配并提取每个元组中的元素并按字符串大小进行过滤。要打印列表,请考虑 aList.foreach(println)
.
我喜欢@prayagupd 使用collect 回答。但是 foldLeft 是我最喜欢的 Scala 函数之一!你可以使用 foldLeft:
scala> val input : List[(Int,String)] = List((1,"apple"),(2,"ball"),(3,"cat"),(4,"doll"),(5,"eggs"))
input: List[(Int, String)] = List((1,apple), (2,ball), (3,cat), (4,doll), (5,eggs))
scala> input.foldLeft(List.empty[Int]){case (acc, (n,str)) => if(str.length ==4) acc :+ n else acc}
res3: List[Int] = List(2, 4, 5)
这样做:
tuple2.filter(_._2.size==4).map(_._1)
在 Scala REPL 中:
scala> val tuple2 : List[(Int,String)] = List((1,"apple"),(2,"ball"),(3,"cat"),(4,"doll"),(5,"eggs"))
tuple2: List[(Int, String)] = List((1,apple), (2,ball), (3,cat), (4,doll), (5,eggs))
scala> tuple2.filter(_._2.size==4).map(_._1)
res261: List[Int] = List(2, 4, 5)
scala>