Сравните два списка [CustomObject] в Scala - PullRequest
1 голос
/ 20 сентября 2011

Допустим, у меня есть 2 списка:

val list1:List[CustomObject] = List(obj1, obj2, obj3)
val list2:List[CustomObject] = List(obj4, obj5, obj6)

Мне было интересно, есть ли такой подход в Scala, который берет эти 2 списка и сравнивает, встречается ли obj.name из первого списка во втором списке.

Это можно сделать, используя 2 внутренних цикла и флаг. Однако мне было интересно, есть ли в Scala что-нибудь, способное это сделать.

Ответы [ 3 ]

8 голосов
/ 20 сентября 2011

Если упорядочен атрибут, который вы хотите использовать для сравнения, то это работает:

import scala.collection.immutable.SortedSet
val set1 = SortedSet(list1: _*)(Ordering by (_.name))
val set2 = SortedSet(list2: _*)(Ordering by (_.name))

val result = set1 &~ set2 union set2 &~ set1
val result2 = set1 | set2 diff set1 & set2 // also works

Теперь, если это невозможно, это работает:

for {
  x <- list1 ++ list2 // you want elements from both, right?
  if list1.forall(_.name != x.name) || list2.forall(_.name != x.name)
} yield x

Очень неэффективно. Чтобы сделать его эффективным, используйте Map:

def carName = (x: Car) => x.name -> x
val map1 = (list1 map carName).toMap
val map2 = (list2 map carName).toMap
for {
  x <- list1 ++ list2 // you want elements from both, right?
  if map1(x).isEmpty || map2(x).isEmpty
} yield x
2 голосов
/ 20 сентября 2011

Что-то похожее на это должно работать

list1.exists(a => list2.exists( b => a.name == b.name))
0 голосов
/ 21 сентября 2011

У меня отлично работает следующее:

 val comparisonResultList: List[Car] =
      for (l1 <- list1 if list2.filter(_.referenceName==l1.referenceName)==Nil)
      yield l1

Спасибо всем за поддержку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...