Program Club

Scala에서 어떻게 배열을 패턴 화합니까?

proclub 2020. 11. 17. 21:17
반응형

Scala에서 어떻게 배열을 패턴 화합니까?


내 메서드 정의는 다음과 같습니다.

def processLine(tokens: Array[String]) = tokens match { // ...

두 번째 문자열이 비어 있는지 알고 싶다고 가정 해 보겠습니다.

case "" == tokens(1) => println("empty")

컴파일하지 않습니다. 어떻게해야합니까?


두 번째 요소가 빈 문자열인지 확인하기 위해 배열에서 패턴 일치를 수행하려는 경우 다음을 수행 할 수 있습니다.

def processLine(tokens: Array[String]) = tokens match {
  case Array(_, "", _*) => "second is empty"
  case _ => "default"
}

_*것도 포함하지 요소의 수에 결합한다. 이것은 아마도 더 잘 알려진 목록의 다음 일치와 유사합니다.

def processLine(tokens: List[String]) = tokens match {
  case _ :: "" :: _ => "second is empty"
  case _ => "default"
}

패턴 일치는 귀하의 예에 적합한 선택이 아닐 수 있습니다. 간단하게 다음을 수행 할 수 있습니다.

if( tokens(1) == "" ) {
  println("empty")
}

패턴 일치는 다음과 같은 경우에 더 적합합니다.

for( t <- tokens ) t match {
   case "" => println( "Empty" )
   case s => println( "Value: " + s )
}

각 토큰에 대해 무언가를 인쇄합니다.

편집 : 빈 문자열 인 토큰이 있는지 확인하려면 다음을 시도 할 수도 있습니다.

if( tokens.exists( _ == "" ) ) {
  println("Found empty token")
}

더 멋진 점은 _*다음과 같은 항목과 일치하는 항목에 별칭을 사용할 수 있다는 것입니다.

val lines: List[String] = List("Alice Bob Carol", "Bob Carol", "Carol Diane Alice")

lines foreach { line =>
  line split "\\s+" match {
    case Array(userName, friends@_*) => { /* Process user and his friends */ }
  }
}

case성명은 그렇게 작동하지 않습니다. 다음과 같아야합니다.

case _ if "" == tokens(1) => println("empty")

참고 URL : https://stackoverflow.com/questions/6647166/how-do-i-pattern-match-arrays-in-scala

반응형