2015-12-19 3 views
0

Я пишу метод equals для класса Scala, где accumUpdates имеет карту [Long, Any]. Я попробовал следующее:Iterate Записи карты внутри оператора соответствия

override def equals(other: Any): Boolean = other match { 
    case that: DirectTaskResult[_] if (!this.valueBytes.equals(that.valueBytes)) => false 
    case that: DirectTaskResult[_] if (this.accumUpdates.size != that.accumUpdates.size) => false 
    case that: DirectTaskResult[_] => { 
     for ((key, value) <- this.accumUpdates) { 
     if (!value.equals(that.accumUpdates.get(key))) false 
     } 
    } 
    case _ => false 
    } 

выше дал мне:

TaskResult.scala:53: type mismatch; 
[error] found : Unit 
[error] required: Boolean 
[error]  for ((key, value) <- this.accumUpdates) { 
[error]      ^
[error] one error found 

Может кто-то обеспечить подсказку, как записи Карта может повторяться?

Благодаря

ответ

0

Попробуйте что-то вроде:

value.filter(value => value._2.equals(value1.get(value._1))).isEmpty 

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

0

Разве вы этого не хотите?

case class DirectTaskResult(accumUpdates: Map[Long, Any]) 

object IterateMap { 
    val accumUpdates = Map[Long, Any](1L -> "one", 2L -> 2, 3L -> 3) 

    def thirdCaseClauseOfEquals(that: DirectTaskResult) = { 
    accumUpdates.keys.forall { key => 
     accumUpdates.get(key) == that.accumUpdates.get(key) 
    } 
    } 
} 

Он успешно с этим тестам:

val t = Map[Long, Any](1L -> "one", 2L -> 2, 3L -> 3) 

assert(IterateMap.thirdCaseClauseOfEquals(DirectTaskResult(t)) == true) 
assert(IterateMap.thirdCaseClauseOfEquals(DirectTaskResult(t + (4L -> "Four"))) == true) 
assert(IterateMap.thirdCaseClauseOfEquals(DirectTaskResult(t - 1L)) == false) 
0

Ваш Перебор значений карте хорошо, но ваш для цикла нет. For-loop всегда возвращает Unit. Если вы хотите вернуть что-то еще, кроме Unit, вы должны использовать конструкцию for-yield. Другие ответы показали, как переформулировать это - мне особенно нравится решение с forAll, который уже имеет для цикла, построенного в

здесь иллюстрация для разности между и-выходом

scala> def a(mym:Map[_,_]) = {for ((k,v)<-mym) k} 
a: (mym: Map[_, _])Unit 

scala> def a(mym:Map[_,_]) = {for ((k,v)<-mym) yield k} 
a: (mym: Map[_, _])scala.collection.immutable.Iterable[Any] 
.
Смежные вопросы