kgx*_*kgx 13 scala scala-collections
基于索引位置,在Scala中仅迭代集合中奇数成员的有效方法是什么?
鉴于此列表:
val fruits: List[String] = List("apples", "oranges", "pears", "bananas")
Run Code Online (Sandbox Code Playgroud)
我想跳过苹果和梨,加工橙子和香蕉.谢谢!
根据给出的答复进行更新:
哇,前三个答案中的每一个都有其优点.我最初的意思是从Scala Collections语法角度来看"有效"这个词,而我实际上只是在寻找一种灵活的方法来为后续迭代创建子列表.@Senia在引入sliding()函数方面做得很好,非常适合这个特殊用例,但我也喜欢@Brian使用zipWithIndex()的更通用的方法.
但是,当我考虑最初提出的问题的实际措辞和@ sourcedelica的响应的计算效率时,我认为他获得了这个奖项.
sen*_*nia 16
scala> List("apples", "oranges", "pears", "bananas").drop(1).sliding(1, 2).flatten.toList
res0: List[java.lang.String] = List(oranges, bananas)
Run Code Online (Sandbox Code Playgroud)
Bri*_*ian 14
val fruits: List[String] = List("apples", "oranges", "pears", "bananas")
fruits.zipWithIndex.filter(_._2 % 2 == 1).map(_._1)
res0: List[String] = List(oranges, bananas)
Run Code Online (Sandbox Code Playgroud)
zipWithIndex将List中的每个元素与索引配对:
List[(String, Int)] = List((apples,0), (oranges,1), (pears,2), (bananas,3))
通过filter(_._2 % 2 == 1)给出过滤奇数元素:
List[(String, Int)] = List((oranges,1), (bananas,3))
通过给出每个元组的第一个元素,将List [(String,Int)]映射到List [String] .map(_._1):
List[String] = List(oranges, bananas)
这是一种直接迭代奇数的方法:
val fruits: List[String] = List("apples", "oranges", "pears", "bananas")
//> fruits : List[String] = List(apples, oranges, pears, bananas)
val oddFruitsIterator =
Iterator.from(1, 2).takeWhile(_ < fruits.size).map(fruits(_))
//> oddFruits : Iterator[String] = non-empty iterator
oddFruitsIterator.foreach(println)
//> oranges
//> bananas
Run Code Online (Sandbox Code Playgroud)
如果它是一个大型集合和/或您正在进行大量迭代,那么您将需要考虑将其转换为IndexedSeq第一个,因此它fruits(_)是O(1).例如:
val fruitsIs = fruits.toIndexedSeq
val oddFruits = Iterator.from(1, 2).takeWhile(_ < fruitsIs.size).map(fruitsIs(_))
Run Code Online (Sandbox Code Playgroud)
请注意,迭代器本身与它迭代的集合是分开的.这是另一个更清晰的例子:
scala> val oddSeqIterator =
(seq: Seq[String]) => Iterator.from(1, 2).takeWhile(_ < seq.size).map(seq(_))
oddSeqIterator: Seq[String] => Iterator[String] = <function1>
scala> val fruits: List[String] = List("apples", "oranges", "pears", "bananas")
fruits: List[String] = List(apples, oranges, pears, bananas)
scala> oddSeqIterator(fruits)
res0: Iterator[String] = non-empty iterator
scala> res0.foreach(println)
oranges
bananas
Run Code Online (Sandbox Code Playgroud)