斯卡拉,使我的循环更多的功能 [英] Scala, make my loop more functional

查看:128
本文介绍了斯卡拉,使我的循环更多的功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图减少我编写像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
}
}

第二次尝试(不是更好,但使用不可变映射和'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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆