2013-08-26 123 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 
    } 
    }