我想编写一个获取字符列表并返回一个列表的方法,该列表的每个元素将是一个(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))
。
我想以功能性的方式解决此问题,因此没有可变变量。
答案 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)
将zipWithIndex
与map
一起使用,如下所示:
x.zipWithIndex.map(v=>(v._2,v._1))
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()在列表上进行多个解析。如果该列表很大,则会产生很大的性能开销。