将地图中的键与列表中的每个字符串进行比较,如果它们匹配,则将其存储在新地图中,并使用旧地图中的相应值

时间:2017-05-08 20:09:36

标签: scala list hashmap

例如:

地图如下:

  

output = Map(执行 - > 1,() - > 2,for - > 1,in - > 1,brutalized - > 1,everyone - > 1,felt - > 1,基督 - > 1,全部 - > 1,锯 - > 1,哭 - > 1,它 - > 1,2 - > 1,a - > 2,男人 - > 1,i - > 3,to - > 1,cried - > 1,you - > 1,tuned - > 1,around - > 1,是> 1,其中 - > 1,小时 - > 1,如何 - > 1,电视转播 - > 1,我 - > 1,不是 - > 1,可能 - > 1,是 - > 1,激情 - > 1,我们 - > 1, sat - > 1,当 - > 1,像 - > 1, - > 2, - > 1,观看 - > 1,诉讼 - > 1, - > 3)类型[Any,Int]

List(pos)是从包含大量单词的文件创建的。可以在正面词语部分找到here。为了创建该列表,我使用了以下代码:

val words = """([A-Za-z])+""".r val pos = scala.io.Source.fromFile("Positive_words.txt").getLines.drop(35).flatMap(words.findAllIn).toList

我注意到当列表与地图匹配时使用:

val result = output.filterKeys(pos.contains)

output.foreach { x => pos.foreach { aa => if(x._1.toString() == aa) <create a new hashmap>}}

会导致意外情况。有一些词虽然pos中不存在,但在输出中显示。

以下输出摘录:

  

val result = output.filterKeys(pos.contains)

     

结果:scala.collection.immutable.Map [A​​ny,Int] = Map(in - &gt; 9,all - &gt; 1,a - &gt; 2,to - &gt; 1,around - &gt; 1,激情 - &gt; 1,喜欢 - &gt; 1, - &gt; 2, - &gt; 3)   这是打印一些不相关的项目,甚至不是list = pos。

的一部分

像in,all,to words这样的词语。

PS:如果在没有使用上述代码的情况下创建一个简单的列表(pos),输出就可以了。

3 个答案:

答案 0 :(得分:1)

您可以使用地图filterKeys仅保留pos列表中存在的密钥,使用pos.contains作为谓词:

val result = output.filterKeys(pos.contains)
result.foreach(println) 

答案 1 :(得分:0)

我不知道这是否对你有帮助。但通常只有基元(boolean,int,每种类型的小写开头)都应与&#34; ==&#34;进行比较。所有其他对象都应该与.equals()进行比较,而String就是这样的对象。 也许你只是记住这一点。

答案 2 :(得分:0)

在创建列表时使用flatMap会产生问题。

通过使用以下代码而不是我之前编写的代码解决了这个问题:

check = False For i = 2 To Rows.Count For j = 1 To 50 Cells(i, 2).Value = i If Cells(i, 1).Value = Cells(6, 6).Value Then check = True End If Next j If check = True Then j = 1 End If toAdd = True Next i

感谢。