-1

私(scala初心者)が探していたのですが、この次の問題を解決する適切な方法が見つかりませんでした。

Enumeration オブジェクト (変更されません):

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

Json 配列 (case1):

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

Json 配列 (ケース 2):

"eyeColor": []

Json 配列 (case3):

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

このソリューションは、フィールド「eyeColor」の json 検証である必要があります。

ケース 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は、私が望むように機能していません。この仕事を成し遂げるためのもっと簡単な方法はおそらくありますか?

ありがとうございます。

4

2 に答える 2

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
    }
  }
于 2013-08-28T10:00:04.290 に答える
0

それが機能しない理由は、この方法で使用される内包表記が、括弧内に作成した Range インスタンスに対して .foreach 呼び出しを実行しているためです (返そうとした値ではなく Unit を返します)。

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

Scala のコレクションが提供する forall メソッドと exists メソッドの組み合わせが必要なようです。

于 2013-08-26T09:39:11.540 に答える