给定一个输入List(1,2,3,4,5),写一个可以传递给flatMap的函数,并返回结果List(1,2,2,3,3,4,4,5)

时间:2017-10-20 16:07:39

标签: scala

enter image description here给定输入List(1,2,3,4,5),编写一个可以传递给flatMap的函数,并返回结果List(1,2,2,3,3,4,4,5)

我写的解决方案如下:

object Main extends App {
   val intList = List(1,2,3,4,5)
   def returnTwo(arg: Int): List[Int] = List(arg, arg + 1)
   val newList = intList.flatMap(returnTwo).filter(_ <= 5)
   println(newList)
}

输出:

List(1, 2, 2, 3, 3, 4, 4, 5, 5)

如何处理列表中的额外5,同时坚持原始问题?

5 个答案:

答案 0 :(得分:1)

你已经实现了这个功能。你唯一的问题是尾随额外的5.你可以使用init函数来处理它,它除了List的最后一个元素之外的所有元素。

val newList = intList.flatMap(returnTwo).filter(_ <= 5).init

答案 1 :(得分:1)

这个也很好

object Main extends App 
{
  val input = List(1,2,3,4)  
  def add(x: Int)= List (x,x+1)  
  val result = input.flatMap(a=>add(a))
  println(result)
}

答案 2 :(得分:0)

如果输入列表总是给定列表,即List(1,2,3,4,5),那么我们可以稍微硬编码,无论如何你已经使用过滤器了。

object Main extends App {
   val intList = List(1,2,3,4,5)
   def returnTwo(arg: Int): List[Int] = {
       if(arg == 1 || arg == 5) List(arg) else List(arg,arg)
   }
   val newList = intList.flatMap(returnTwo)
   println(newList)
}

答案 3 :(得分:0)

如@ sepp2k所述,您的示例在初始列表中有5。以下是另一个不需要flatMap或过滤的实现。

def returnTwo (list: List[Int]): List[Int] = {
  list match {
    case Nil => List.empty[Int]
    case head :: tail => List(head, head + 1) ++ returnTwo(tail)
  }
}

returnTwo(List(1,2,3,4))

答案 4 :(得分:0)

intList.head +: intList.init.tail.flatMap(returnTwo) :+ intList.last