【发布时间】:2016-02-10 01:16:01
【问题描述】:
我需要一点帮助。
我一直在研究 Scala 的功能方面。几乎所有的工作都在列表中,在大多数情况下,我可以解决问题,但我遇到了一个小死胡同。在某些问题中,我无法保留列表的原始形式(结构)。在输出中,所有嵌套列表都被展平。连接 ::: 使列表变平(即原始列表的一个元素)并附加 :: 给我一个编译错误,因为它需要通用 T 类型(不是列表)。
一个非常简单的例子,我想删除列表中与输入匹配的第一个元素:
def removeFirst[T](obj: T, list: List[T]): List[T] = {
if (list isEmpty) Nil
else{
val fin: List[T] = list.head match {
case headAsList: List[T] => if (containsWithNestedLists(obj, headAsList))
removeFirst(obj, headAsList) ::: list.tail
else headAsList ::: removeFirst(obj, list.tail)
case _ => if (list.head == obj) list.tail
else if (list.tail == List()) List(list.head)
else list.head :: removeFirst(obj, list.tail)
}
fin
}
}
对于一级深度列表,它可以正常工作,但是
出来的输出
removeFirst(1,List(List(1,2,3),1,2,3,4,5,6)) 是 List(2, 3, 1, 2, 3, 4, 5, 6),理想情况下我想要 List(List(2,3),1, 2,3,4,5,6)).
或者更具体的输入removeFirst(1,List(List(2,3,List()),List(1,2,3),1,2,3,4,5,6,List(2,3,List())))
应该有输出=List(List(2,3,List()),List(2,3),1,2,3,4,5,6,List(1,2,3,List()))
我还发现删除通用 T 并在其位置使用 Any 可以解决问题,但我也知道 Any 是一个很大的 no-no 和临时解决一个永久性问题,因为它在其他功能中没有帮助。
据我所知,我还没有在互联网上看到有用的解决方案,所以我不得不问。我错过了什么,需要调试还是有其他功能可以帮助我?我最接近答案的方法是以某种方式使用 append ::,但我可能错了。
【问题讨论】:
-
您能否提供一些示例来说明您在函数中要查找的内容?示例:
double: Int => Int, double(5) === 10 -
对于这个特定的功能,我确实有一个可以按我的意图工作的版本 def removeFirst(obj: Any, list: List[Any]): List[Any] = { if (list isEmpty) Nil else { val fin: List[Any] = list.head match { case headAsList: List[Any] => if (containsWithNestedLists(obj, headAsList)) removeFirst(obj, headAsList) :: list.tail else headAsList :: removeFirst(obj , list.tail) case _ => if (list.head == obj) list.tail else list.head :: removeFirst(obj, list.tail) } fin } } 如果你测试一些例子,你可能会得到什么..
-
对于 cmets 中的多行代码,我礼貌地建议使用 gist。
-
..我打算作为输出,比我能解释的要好得多。但我遇到的主要问题是保持结构完整(使用泛型,而不是
Any)。该功能可以删除元素的最后一次出现、所有出现、第 N 次出现、删除第 N 级列表中的所有元素、将元素添加到第 N 级列表等。编辑:抱歉代码,我是新手 :)
标签: list scala functional-programming nested-lists