2016-03-08 2 views
1

Контекст сравнивает два ключа и значения карты в Scala, но я не уверен, что знаю, как правильно это задавать. Скажем, у меня есть два конкретных классовСкала, сравнивающая две клавиши и значения карты

case class WhiteList(attributes: Option[Map[String, Set[String]]]) 

и

case class Query(attributes: Option[Map[String, Set[String]]]) 

Я хочу, чтобы сравнить значения атрибутов между этими двумя классами, если ключ в карте атрибутов одинакова и в противном случае вернуть false.

Так что, если у меня был

val wl = WhiteList(attributes = Some(Map("patterns" -> Set("plaid"), 
             "colors" -> Set("blue", "orange"))) 

и

val q = Query(attributes = Some(Map("patterns" -> Set("plaid"), 
            "colors" -> Set("orange"))) 

Если я сравнил эти два, я хочу вернуться true, потому что: 1) они имеют одинаковые ключи Карта и 2) значения соответствующих ключей пересекаются

Если бы у меня было

val q2 = Query(attributes = Some(Map("patterns" -> Set("stripes"), 
            "colors" -> Set("orange", "red", "blue"))) 

и сравнили значения соответствующих ключей с wl, я хочу false, потому что значение «pattern» не пересекается.

Если бы я был

val q3 = Query(attributes = Some(Map("starwars" -> Set("a new hope", "empire strikes back"), 
            "patterns" -> Set("stripes"), 
            "colors" -> Set("orange", "red", "blue"))) 

и сравнивали q3 к WL, я ожидал бы false, потому что ключи атрибута не один-к-одному.

Я думаю, что должен быть функциональный способ сделать это.

+0

Из интереса, два класса случая выглядят одинаково, почему два случая классов вместо одного? – bjfletcher

ответ

3

Может быть, так?

def areEqual(wl: WhiteList, q: Query) = (wl, q) match { 
    case (WhiteList(Some(map1)), Query(Some(map2))) => 
    map1.keySet == map2.keySet && 
     map1.keySet.forall(key => (map1(key) intersect map2(key)).nonEmpty) 
    case _ => false 
} 

испытания в РЕПЛ:

val wl = WhiteList(attributes = Some(Map("patterns" -> Set("plaid"),             
             "colors" -> Set("blue", "orange"))))           

val q = Query(attributes = Some(Map("patterns" -> Set("plaid"),               
            "colors" -> Set("orange"))))              

val q2 = Query(attributes = Some(Map("patterns" -> Set("stripes"),              
            "colors" -> Set("orange", "red", "blue"))))           

val q3 = Query(attributes = Some(Map("starwars" -> Set("a new hope", "empire strikes back"),       
            "patterns" -> Set("stripes"),              
            "colors" -> Set("orange", "red", "blue"))))          

scala> areEqual(wl, q)                         
res4: Boolean = true                         

scala> areEqual(wl, q2)                         
res5: Boolean = false                         

scala> areEqual(wl, q3)                         
res6: Boolean = false                         
+0

Wow thanks @Lukasz –

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