2016-12-12 3 views
1

В настоящее время у меня есть карта в scala, и мне нужно получить ключ (или ключи!), Которые соответствуют определенному значению.Извлечение ключа из карты в Scala с использованием значения

В настоящее время у меня есть карта учащихся и результаты тестов, и вам нужно найти студентов, которые набрали значение, которое я вводил.

Моя карта выглядит следующим образом:

var students = Map(
"Neil" -> 87 
"Buzz" -> 71 
"Michael" -> 95 
) 

Как я мог искать через эту карту, чтобы найти студента, который набрал 71, например, а затем вернуть ключ?

Заранее спасибо.

+0

Пытались ли вы что-нибудь? :) –

+0

Я пробовал много методов карты, но все они, похоже, озабочены возвратом значения на основе ключа, а не наоборот. – Asimov

+0

Как 'students.filter {(ключ, значение) => значение> 50}'? –

ответ

1

Во-первых, вы, вероятно, следует с помощью val вместо var, как это: val students = Map("Neil" -> 97, "Buzz" -> 71, "Michael" -> 95)

Во-вторых, метод, который вы, вероятно, хотите называется find.

Что-то вроде этого students.find(_._2 == 71).map(_._1)

Который в основном говорит, найти меня первый (ключ, значение) пара, где значение (_._2 == 71) составляет 71, а затем выбросить значение .map(_._1). Он будет завернут в опцию, потому что может быть 0 совпадений.

Если у вас есть что-то, чтобы гарантировать, что значение никогда не появляется более одного раза, вы можете быть более счастливы с результатами от filter.

+0

Возможно, изменен ответ: «Мне нужно получить ключ (или ключи!)». Таким образом, похоже, что 'filter' является правильной опцией –

2

Вы можете использовать следующий код для достижения этой

students.filter(_._2 == 71).map(_._1) 
1

Проверьте следующее:

val students = Map("N" -> 87, "B" -> 71, "M" -> 95, "X" -> 95) 
students.filter(_._2 == 95).keys 
res3: Iterable[String] = Set(M, X) 
-1

Сжатые и ясно

Просто собрать имя студента с данным счетом.

student collect { case (name, 10) => name} headOption 

использование Collect

val students = Map("Scala" -> 10, "Haskell" -> 20, "frege" -> 30) 

student collect { case (name, 10) => name} headOption 

Приведенный выше код собирает имя человека, счет которого составляет 10, а затем сделать headOption, чтобы получить первое лицо. Приведенный выше код возвращает None, если нет совпадения.

выход Scala РЕПЛ

scala> val students = Map("Scala" -> 10, "Haskell" -> 20, "frege" -> 30) 
students: scala.collection.immutable.Map[String,Int] = Map(Scala -> 10, Haskell -> 20, frege -> 30) 

scala> students collect { case (name, 10) => name } 
res3: scala.collection.immutable.Iterable[String] = List(Scala) 

scala> students collect { case (name, 10000) => name } 
res4: scala.collection.immutable.Iterable[String] = List() 

scala> students collect { case (name, 10) => name } headOption 
warning: there was one feature warning; re-run with -feature for details 
res5: Option[String] = Some(Scala) 
Смежные вопросы