2015-03-18 7 views
0
val nums = Map('M' -> 1000, 'D' -> 500, 'C' -> 100, 'L' -> 50, 'X' -> 10, 'V' -> 5, 'I' -> 1) 
def convert(data : String):Int = { 
    var count = 0; 
    var index = 0; 
    var list: List[Char] = List(); 

    for((value,index) <- data.reverse.zipWithIndex){ 
     list = value :: list; 
    } 

    def calcRM(rm : List[Char]): List[Char] = rm match{ 
     case x :: Nil => x 
     case x :: tail => ??? 
     case Nil => Nil 
    } 

    return count   
    } 
} 

Мне интересно, как я могу преобразовать значение я получаю от x(head) и tail.head с помощью Map при условии, так что я могу преобразовать строку значения римскими цифрами.Использование карт в Scala

ответ

3

Чтобы получить доступ к карте, вы просто использовать его get метод:

nums.get(x) 

который возвращает Option, что вам придется разворачивать, так что вы можете взять на себя все хорошие значения и использовать apply:

nums(x) //Throws if key not found 

или вы могли бы использовать по умолчанию:

nums.getOrElse(x, 0) 
0

Yo u ищите метод apply на Map. Напомним, что вы можете вызвать apply просто путем добавления скобок:

nums('M') //returns 1000 
nums.apply('M') //equivalent in Scala 

Вы также можете использовать get вернуть Option[Int], если вы не уверены, что ключ доступен в Map, и вы хотите, чтобы избежать исключения, которые бы в противном случае брошенный применяются:

nums.get('M') //returns Some(1000) 
nums.get('K') //returns None 
nums('K') //throws an exception 

Я также рекомендую посмотреть на некоторые из более идиоматических парадигм в Scala (например, с использованием val). Для примера, можно рассмотреть что-то вроде этого, который использует внутренние методы и значение, несколько более сложный поиск по шаблону, постоянно важный map метода, неявное apply, используемое в карте, и рекурсия:

def convert(rm: String) = { 
    val nums = Map('M' -> 1000, 'D' -> 500, 'C' -> 100, 'L' -> 50, 'X' -> 10, 'V' -> 5, 'I' -> 1) 
    def calcRM(rm: Seq[Int]): Int = rm match { 
     case x :: y :: tail if x < y => y - x + calcRM(tail) 
     case x :: tail => x + calcRM(tail) 
     case Nil => 0 
    } 
    calcRM(rm.map(nums).toList) 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^