2013-03-23 4 views
1

У меня есть scala Map[String, String], и я сравниваю часть ключа с ее значением только для середины третьей карты. Так как это непростая итерация с использованием индексов на карте, я придумал следующее, но это не сработает.Итерация над третьей частью карты

var i = 0 
    var j = 0 
    val mapSize = sortedMap.size/3 
    for((key,value) <- sortedMap) { 
     j+=1 
     if((i < 3) && (key.split(' ').take(1).mkString==value)&&(j>mapSize)){ 
      Accuracy += 1 
      i += 1 
     } 
    } 

ответ

1

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

val middle = sortedMap.toStream.drop(sortedMap.size/3).dropRight(sortedMap.size/3) 
middle.foreach(println _) // replace println with your key test 

Для ключевого теста, вы можете использовать поиск по шаблону на

case key if key.split(' ')(0) == value => ...do something... 
5

Вы можете использовать метод slice(from: Int, until: Int), а затем только перебирать среднюю треть отсортированном карты. Что-то вроде

val mapSize = sortedMap.size 
for ((key, value) <- sortedMap.slice(mapSize/3, 2*mapSize/3)) { 
    ... 
} 

Обратите внимание, что это только надежным, если базовая карта сортируется (как, кажется, дело в вашем примере). Возможно, вам также придется немного адаптировать расчет индекса, в зависимости от того, что именно вы считаете средней третью для карт, размер которых не делится на 3.

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