获取编译错误 - 转发引用扩展了值lst的定义:
val lt = List(1,2,3,3,2,4,5,1,5,7,8,7)
var cond = false
do
{
var cond = if (lt.tail contains lt.head) true else false
if (cond == true) {
val lst : List[Int]= lt.filter(_!=lt.head)
val lt = lst
}
else {
println(lt.head)
}
}
while(cond == false)
答案 0 :(得分:2)
您可以使用find
实现“先获取”,然后您可以使用count == 1
实现“非经常性”,因此代码为
lt.find(x => lt.count(_ == x) == 1)
这将返回Option[Int]
,可以通常的方式取消。
此算法清晰但效率不高,因此对于很长的列表,您可能需要预先计算计数,或使用递归函数来实现原始算法。这样做不太清楚但效率更高,所以要避免它,除非你能证明效率低下导致了问题。
以下是预先计算每个值的计数的示例。对于长列表,这可能更快,因为Map
操作通常为O(log n),因此对于先前版本,函数为O(n log n)而不是O(n 2 )。
def firstUniq[A](in: Seq[A]): Option[A] = {
val m = mutable.Map.empty[A, Int]
for (elem <- in) {
m.update(elem, m.getOrElseUpdate(elem, 0) + 1)
}
val singles = m.filter(_._2 == 1)
in.find(singles.contains)
}
答案 1 :(得分:0)
使用scala
获取列表中的第一个非重复元素
您可以使用filter
和count
作为
val firstNonRecurrringValue = lt.filter(x => lt.count(_ == x) == 1)(0)
所以firstNonRecurrringValue
是4
但是看一下你的do while
代码,你似乎正在尝试打印第一个不再重复的元素。对于以下代码应该工作
val firstNonRecurringValue = lt.zipWithIndex.filter(x => lt.drop(x._2).count(_ == x._1) == 1)(0)._1
现在firstNonRecurringValue
应为3