斯卡拉,使我的循环更多的功能 [英] Scala, make my loop more functional
本文介绍了斯卡拉,使我的循环更多的功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我试图减少我编写像Java一样的Scala(2.8)的程度。这是我遇到的一个问题的简化。你可以建议改进我的解决方案更实用吗?
转换地图
val inputMap = mutable.LinkedHashMap(1-> a,2→a→3→b→4→z→5→→通过丢弃值为'z'的任何条目并在遇到字符时对其进行索引
/ p>
第一次尝试
var outputMap = new mutable.HashMap [Char, (kvp< - inputMap){
val字符= kvp._2
if(character!='z'&& amp; amp; ;!outputMap.contains(character)){
outputMap + =(character - > counter)
counter + = 1
}
}
$ c
第二次尝试(不是更好,但使用不可变映射和'foreach')
var outputMap = new immutable.HashMap [Char,Int]()
var counter = 0
inputMap.foreach {
case(number ,character)=> {
if(character!='z'&&!outputMap.contains(character)){
outputMap2 + =(字符 - >计数器)
计数器+ = 1
$ b $ / code>
解决方案更好的解决方案:
inputMap.toList.filter(_._ 2!='z')。map(_._ 2 ).distinct.zipWithIndex.toMap
I'm trying to reduce the extent to which I write Scala (2.8) like Java. Here's a simplification of a problem I came across. Can you suggest improvements on my solutions that are "more functional"?
Transform the map
val inputMap = mutable.LinkedHashMap(1->'a',2->'a',3->'b',4->'z',5->'c')
by discarding any entries with value 'z' and indexing the characters as they are encountered
First try
var outputMap = new mutable.HashMap[Char,Int]()
var counter = 0
for(kvp <- inputMap){
val character = kvp._2
if(character !='z' && !outputMap.contains(character)){
outputMap += (character -> counter)
counter += 1
}
}
Second try (not much better, but uses an immutable map and a 'foreach')
var outputMap = new immutable.HashMap[Char,Int]()
var counter = 0
inputMap.foreach{
case(number,character) => {
if(character !='z' && !outputMap.contains(character)){
outputMap2 += (character -> counter)
counter += 1
}
}
}
解决方案 Nicer solution:
inputMap.toList.filter(_._2 != 'z').map(_._2).distinct.zipWithIndex.toMap
这篇关于斯卡拉,使我的循环更多的功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文