2016-09-18 1 views
0

이 두 개가 있습니다. Map[String, String]이고 업데이트 된 값으로 새 맵을 만들어야합니다. 두 번째 Map에 새로운 키 또는 null이 아닌 값 또는 첫 번째 Map보다 큰 값이있는 경우 업데이트가 수행됩니다. 예를 들어None의 가능성이있는 두 개의 맵 키와 scala의 null을 비교합니다.

:

업데이트 시나리오

  • FirstMap("key1" -> "123") 경우 다음 SecondMap("key1" -> "456")ResultMap("key1" -> "456")
  • 다음과 FirstMap("key1" -> null)SecondMap("key1" -> "value1")ResultMap("key1" -> "value1")
  • 경우 FirstMap()SecondMap("key1" -> "value1") 경우 ResultMap("key1" -> "value1")

비 업데이트 시나리오

  • 경우 FirstMap("key1" -> "value1") 다음 SecondMap() ResultMap("key1" -> "value1")

  • FirstMap("key1" -> "value1") 경우 다음 SecondMap("key1" -> null)ResultMap("key1" -> "value1")

  • 경우 상태를 수용하는 방법에 대한 어떤 제안

    val currentFieldValue = currentDetail.get(field).get 
    val newFieldValue = newDetail.get(field).get 
    
    currentFieldValue match { 
        case null if newFieldValue != null => currentDetail ++ Map(s"$field" -> s"$newFieldValue") 
        case _ if newFieldValue != null && newFieldValue.toInt > currentFieldValue.toInt => currentDetail ++ Map(s"$field" -> s"$newFieldValue") 
        case _ => currentDetail 
    } 
    

    즉 때 키 자체가 itsn't : 4,251,353,210 및 SecondMap("key1" -> "456") 다음 ResultMap("key1" -> "789")

지금까지 나는 아래의 코드가?

+0

'케이스 없음'이 작동하지 않습니까? – Samar

답변

1

map.get(key) 반환 Option 옵션에 패턴 일치하고 여기에 대안이 완료된 것처럼

(currentDetail.get(field), newDetail.get(field)) match { 
    case (Some(null), Some(null)) => 
    case (Some(null), Some(value)) => 
    case (Some(value), Some(null)) => 
    case (Some(value), None) => 
    case (None, Some(value)) => 
    case (None, None) => 
    case (_, _) => 
} 
1

을 원하는 (디버그 MSG를 포함) 기능을 비교 한 많은 관련 사례를 만들 :

def compare(currentDetail: Map[String, String], newDetail: Map[String, String]): Map[String, String] = { 
    var resMap = Map[String, String]() 
    currentDetail.keys.foreach { field => 

    val currentField = currentDetail.get(field) 
    val newField = newDetail.get(field) 

    resMap = resMap + { 
     (currentField, newField) match { 
     case (Some(null), Some(newFieldValue: String)) => 
      println("null and not null") 
      (s"${field}" -> newFieldValue) 
     case (Some(currentFieldValue), Some(null)) => 
      println("not null and null") 
      (s"${field}" -> currentFieldValue) 
     case (None, Some(newFieldValue)) => 
      println("none and not null") 
      (s"${field}" -> newFieldValue) 
     case (Some(currentFieldValue), None) => 
      println("not null and none") 
      (s"${field}" -> currentFieldValue) 
     case (Some(currentFieldValue), Some(newFieldValue)) if newFieldValue.toInt > currentFieldValue.toInt => 
      println("not null not null if new bigger then current") 
      (s"${field}" -> newFieldValue) 
     case (Some(currentFieldValue), Some(newFieldValue)) if newFieldValue.toInt <= currentFieldValue.toInt => 
      println("not null not null if new less or equal to current") 
      (s"${field}" -> currentFieldValue) 
     } 
    } 
    } 

    resMap 
} 
1
def combine(m1: Map[String,String], m2: Map[String,String]): Map[String,String] = 
    (m1.keys ++ m2.keys).toSet.map{ k: String => 
    k -> Seq(Option(m1.getOrElse(k,"")), Option(m2.getOrElse(k,"")), Some("")) 
     .flatten.sorted.reverse.head 
    }.toMap 

"456" > "123"StringInt 모두에 해당됩니다. 두 개의 문자열 "99""101"이 있으면 어떻게됩니까? 숫자 비교가 필요한 경우 String ->Int ->String 사이에 더 많은 코드를 전송해야합니다.

관련 문제