Scala[功能]:查找列表中可能重复的元素的实际索引
我想编写一个方法,获取一个字符列表,并返回一个列表,其中每个元素都是(indexOfelement,element)元组 如您所知,我们可以使用索引,如下所示:Scala[功能]:查找列表中可能重复的元素的实际索引,scala,functional-programming,Scala,Functional Programming,我想编写一个方法,获取一个字符列表,并返回一个列表,其中每个元素都是(indexOfelement,element)元组 如您所知,我们可以使用索引,如下所示: def buggyAttempt (charsList: List[Char]): List[(Int, Char)] = charsList.map(char => (charsList.indexOf(char), char)) 如果元素中没有重复,则此操作非常有效。所以问题是,如何处理重复字符列表?例如,如果我给它输入列表
def buggyAttempt (charsList: List[Char]): List[(Int, Char)] = charsList.map(char => (charsList.indexOf(char), char))
如果元素中没有重复,则此操作非常有效。所以问题是,如何处理重复字符列表?例如,如果我给它输入列表(“a”、“b”、“c”、“c”)
,我将得到列表((0,a)、(1,b)、(2,c)、(3,c))
我想用函数的方式解决这个问题,所以没有可变的变量 首先,以下是编译代码的版本:
def notBuggyAttempt (charsList: List[Char]): List[(Int, Char)] = {
charsList.map(char => (charsList.indexOf(char), char))
}
这将返回只有第一个索引的元组
不过,要获得所需内容,可以使用zipWIthIndex,它返回List[(Char,Int)],然后,如果需要List[(Int,Char)],则必须交换元素:
def getIndexTuples (charsList: List[Char]): List[(Int, Char)] = {
charsList.zipWithIndex.map(_.swap)
}
首先,以下是编译代码的版本:
def notBuggyAttempt (charsList: List[Char]): List[(Int, Char)] = {
charsList.map(char => (charsList.indexOf(char), char))
}
这将返回只有第一个索引的元组
不过,要获得所需内容,可以使用zipWIthIndex,它返回List[(Char,Int)],然后,如果需要List[(Int,Char)],则必须交换元素:
def getIndexTuples (charsList: List[Char]): List[(Int, Char)] = {
charsList.zipWithIndex.map(_.swap)
}
假设您的输入是
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))
假设您的输入是
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))
使用
zipWithIndex
和map
如下:
x.zipWithIndex.map(v=>(v._2,v._1))
在Scala REPL中:
使用IndexOf()可以在列表上进行多个分区。如果列表非常大,则会产生显著的性能开销。使用
zipWithIndex
和map
如下所示:
x.zipWithIndex.map(v=>(v._2,v._1))
在Scala REPL中:
使用IndexOf()可以在列表上进行多个分区。如果列表非常大,则会有很大的性能开销。可能是一个输入错误,但我认为你的意思是
列表((0,a)、(1,b)、(2,c)、(3,c))
那么你到底想要什么,列表或不同元素的列表?可能是一个输入错误,但我认为你的意思是列表((0,a)、(1,b)、(2,c)、(3,c))
那么你到底想要什么,列表或不同元素的列表?使用IndexOf()在列表上进行多个分区。如果列表非常大,则会有显著的性能开销。我建议的解决方案没有使用indexOf
,我只是以编译的方式重写了答案的代码。使用indexOf()会对列表进行多个分区。如果列表非常大,则会有显著的性能开销。我建议的解决方案没有使用索引
,我只是以编译的方式重写了答案的代码。