Scala [Functional]:在列表中查找可能重复的元素的实际索引

时间:2018-07-17 11:13:32

标签: scala functional-programming

我想编写一个获取字符列表并返回一个列表的方法,该列表的每个元素将是一个(indexOfelement,元素)元组。

如您所知,我们可以使用indexOf,如下所示:

def buggyAttempt (charsList: List[Char]): List[(Int, Char)] = charsList.map(char => (charsList.indexOf(char), char))

如果元素内没有重复,这很好用。所以问题是,如何处理重复字符列表?例如,如果我喂食List("a", "b", "c", "c"),我将得到List((0,a), (1,b), (2,c), (3,c))

我想以功能性的方式解决此问题,因此没有可变变量。

3 个答案:

答案 0 :(得分:2)

首先,这是编译的代码版本:

def notBuggyAttempt (charsList: List[Char]): List[(Int, Char)] = { 
    charsList.map(char => (charsList.indexOf(char), char))
}

这将只返回第一个索引的元组。

不过,要获得所需的内容,可以使用zipWIthIndex,它返回List [(Char,Int)],然后,如果要List [(Int,Char)],则必须交换元素:< / p>

def getIndexTuples (charsList: List[Char]): List[(Int, Char)] = {
    charsList.zipWithIndex.map(_.swap)
}

答案 1 :(得分:0)

可以说您的输入是

val input = List('a','b','c','c')

您可以使用

获得输出
input.zipWithIndex.collect{
  case (t1,t2) => (t2,t1)
}

输出将为

res0: List[(Int, Char)] = List((0,a), (1,b), (2,c), (3,c))

答案 2 :(得分:0)

zipWithIndexmap一起使用,如下所示:

x.zipWithIndex.map(v=>(v._2,v._1))

在Scala REPL中:

scala> val x = List("a", "b", "c", "c")
x: List[String] = List(a, b, c, c)

scala> x.zipWithIndex.map(v=>(v._2,v._1))
res22: List[(Int, String)] = List((0,a), (1,b), (2,c), (3,c))

使用IndexOf()在列表上进行多个解析。如果该列表很大,则会产生很大的性能开销。