تجد الفرق بين خريطتين

0

لقد وجدت عدة طرق لمعرفة الفرق بين مجموعات المفاتيح بين خريطتين. ومع ذلك ، أريد مقارنة قيم مفتاح> كاملة.

لدي إعداد خريطتين Map[String, Map[String, String]]

لذا إذا كان لدي خريطتان

var source = Map(
  "one" -> Map("a" -> "bbb", "b" -> "qww"),
  "two" -> Map("b" -> "ccc")
)

var target = Map(
  "one" -> Map("a" -> "bbb", "b" -> "qqq", "c" -> "ccc"),
  "two" -> Map("b" -> "ccc")
)

اريد ان افعل شيئا مثل source - target

للحصول على مخرجات نهائية

 Map("one" -> Map("b" -> "qww")

أنا فقط أهتم بضمان كل source يتطابق مع target (لذا في المثال ، target("one")("c") غير ذي صلة). أتساءل عما إذا كان هناك وظيفة لطيفة من سطر واحد يمكنني القيام بها لإنجاز هذا ، إذا لم يكن الأمر كذلك ، يمكنني دائمًا الرجوع إلى كل ذلك ومقارنته يدويًا.

تعديل كود التحديث -

var differences = new ListBuffer[(String, String)]()
source.foreach{
  case (db, tableMap) =>
    tableMap.foreach{
      case (table, createTable) =>
        if(createTable != target(db)(table)){
          differences.append((db, table))
        }
    }
}

2 الاجابة

1
افضل جواب

نظرا لمتطلباتكم ، source diff target (كقوائم) ستعمل بشكل جيد. عبر اجتياز diff قائمة من الخرائط الخارجية باستخدام foldLeft ، تطبيق diff مرة أخرى لكل مفتاح مقابل الخرائط الداخلية بين المصدر والهدف سيولد صافي الخرائط الداخلية المطلوبة:

val source = Map(
  "one" -> Map("a" -> "bbb", "b" -> "qww"),
  "two" -> Map("b" -> "ccc"),
  "three" -> Map("c" -> "xxx")
)

val target = Map(
  "one" -> Map("a" -> "bbb", "b" -> "qqq", "c" -> "ccc"),
  "two" -> Map("b" -> "ccc"),
  "four" -> Map("d" -> "yyy")
)

(source.toList diff target.toList).
  foldLeft( Map[String, Map[String,String]]() ){ (acc, x) =>
    val corrTargMap = target.getOrElse(x._1, Map[String, String]())
    val mapDiff = (x._2.toList diff corrTargMap.toList).toMap
    acc + (x._1 -> mapDiff)
  }
// res1: scala.collection.immutable.Map[String,Map[String,String]] =
//   Map(one -> Map(b -> qww), three -> Map(c -> xxx))
:مؤلف
0

هذا يعمل (لا toList أو toMap التحويلات الخ):

s.map{case (x,y)=>(x,y.filter(p=>t.getOrElse(x,Map()).forall(_!=p)))}.filter(_._2!=Map())

في Scala REPL:

scala> val s = Map(
     |   "one" -> Map("a" -> "bbb", "b" -> "qww"),
     |   "two" -> Map("b" -> "ccc"),
     |   "three" -> Map("c" -> "xxx")
     | )
s: scala.collection.immutable.Map[String,scala.collection.immutable.Map[String,String]] = Map(one -> Map(a -> bbb, b ->
 qww), two -> Map(b -> ccc), three -> Map(c -> xxx))

scala> val t = Map(
     |   "one" -> Map("a" -> "bbb", "b" -> "qqq", "c" -> "ccc"),
     |   "two" -> Map("b" -> "ccc"),
     |   "four" -> Map("d" -> "yyy")
     | )
t: scala.collection.immutable.Map[String,scala.collection.immutable.Map[String,String]] = Map(one -> Map(a -> bbb, b ->
 qqq, c -> ccc), two -> Map(b -> ccc), four -> Map(d -> yyy))

scala> s.map{case (x,y)=>(x,y.filter(p=>t.getOrElse(x,Map()).forall(_!=p)))}.filter(_._2!=Map())
res2: scala.collection.immutable.Map[String,scala.collection.immutable.Map[String,String]] = Map(one -> Map(b -> qww), three
 -> Map(c -> xxx))
:مؤلف
فوق
قائمة طعام