使用scala获取列表中的第一个非重复元素

时间:2018-04-05 05:02:28

标签: scala

获取编译错误 - 转发引用扩展了值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)

2 个答案:

答案 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

获取列表中的第一个非重复元素   

您可以使用filtercount作为

val firstNonRecurrringValue = lt.filter(x => lt.count(_ == x) == 1)(0)

所以firstNonRecurrringValue4

元素

后列表中的第一个非重复元素

但是看一下你的do while代码,你似乎正在尝试打印第一个不再重复的元素。对于以下代码应该工作

val firstNonRecurringValue = lt.zipWithIndex.filter(x => lt.drop(x._2).count(_ == x._1) == 1)(0)._1

现在firstNonRecurringValue应为3