2013-08-26 178 views
-1

我(斯卡拉初學者)正在尋找,但我找不到一個合適的方式來解決這個下面的問題。比較一個JsonArray枚舉

枚舉對象(從不改變):

object EyeColorEnum extends Enumeration{ 
    val Blue = Value("blue") 
    val Brown = Value("brown") 
    val Gray = Value("gray") 
    val Green = Value("green") 
} 

JSON數組(情形1):

"eyeColor": ["blue", "gray", "green"] 

JSON數組(情形2):

"eyeColor": [] 

JSON數組(case3):

"eyeColor": ["orange", "pink", "green"] 

這個解決方案應該是一個json驗證字段「eyeColor」。

案例1和案例2有效。

情況3無效。

for (i <- 1 to(jsonArray.value.length - 1)) {  
    for (j <- 1 to(jsonArray.value.length - 1)) { 
    if(jsonArray(i).as[String] == enumArray(j).toString) { 
     // Item from A exists in B 
     true 
    } else { 
     // Item from A does not exist in B 
     checker = checker + 1 
    } 
    } 
} 

這些for不工作,我希望他們如何工作。 是否有更簡單的方法來完成這項工作?

非常感謝。

回答

0

該原因爲什麼不起作用的是,對於以這種方式使用的解析,正在做.foreach調用您在parens中創建的Range實例(它將返回Unit而不是您嘗試返回的值) :

(1 to (jsonArray.value.length - 1)).foreach{i => ...} 

這聽起來像你想要的Scala提供的集合和存在方法的組合。

+0

難道ü意味着這樣的事情? (0 to(jsonArray.value.length - 1))。foreach {i => (0 to(enumArray.length - 1))。foreach {j => if( jsonArray(i).as [String ] == enumArray(j).toString){ found + = 1 } } – OliverKK

+0

這就像它將代碼轉換成代碼一樣,但是您幾乎可以肯定希望的實現不應該使用foreach,而是全部和/或存在。 –

+0

這是最好的解決方案: (for(needle < - needle if if!haystack.contains(needle))yield needle).isEmpty – OliverKK

0

有沒有人可以指出如何避免var

這是我的醜陋的解決方案:

def apply(enum: Enumeration, jsonArray: JsArray): Boolean = { 
    val enumArray = enum.values.toArray 
    var found = 0 
    jsonArray.value.length match { 
     case 0 => true 
     case _ => 
     (0 to (jsonArray.value.length - 1)).foreach{i => 
      (0 to (enumArray.length - 1)).foreach{j => 
      if (jsonArray(i).as[String] == enumArray(j).toString) { 
       found +=1 
      } 
      } 
     } 
     found == jsonArray.value.length 
    } 
    }