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

Scala[功能]:查找列表中可能重复的元素的实际索引,scala,functional-programming,Scala,Functional Programming,我想编写一个方法,获取一个字符列表,并返回一个列表,其中每个元素都是(indexOfelement,element)元组 如您所知,我们可以使用索引,如下所示: def buggyAttempt (charsList: List[Char]): List[(Int, Char)] = charsList.map(char => (charsList.indexOf(char), char)) 如果元素中没有重复,则此操作非常有效。所以问题是,如何处理重复字符列表?例如,如果我给它输入列表

我想编写一个方法,获取一个字符列表,并返回一个列表,其中每个元素都是(indexOfelement,element)元组

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

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()会对列表进行多个分区。如果列表非常大,则会有显著的性能开销。我建议的解决方案没有使用
索引
,我只是以编译的方式重写了答案的代码。