Извлечение элементов из одного списка, которых нет в другом - PullRequest
4 голосов
/ 05 марта 2012

Просто у меня есть два списка, и мне нужно извлечь новые элементы, добавленные в один из них.У меня есть следующее

val x = List(1,2,3)
val y = List(1,2,4)

val existing :List[Int]= x.map(xInstance => {
      if (!y.exists(yInstance =>
        yInstance == xInstance))
        xInstance
    })

Result :existing: List[AnyVal] = List((), (), 3)

Мне нужно удалить все остальные элементы, кроме чисел с минимальной стоимостью.

Ответы [ 4 ]

17 голосов
/ 05 марта 2012

Выберите подходящую структуру данных, и жизнь станет намного проще.

scala> x.toSet -- y
res1: scala.collection.immutable.Set[Int] = Set(3)

Также следует помнить, что:

if (condition) expr1

является сокращением для:

if (condition) expr1 else ()

Использование результата этого, который обычно будет иметь статический тип Any или AnyVal, почти всегда является ошибкой. Подходит только для побочных эффектов:

if (condition) buffer += 1
if (condition) sys.error("boom!")
14 голосов
/ 05 марта 2012

Retronym-решение в порядке, если у вас нет повторяющихся элементов, и вы не заботитесь о заказе.Однако вы не указываете, что это так.

Следовательно, вероятно, будет наиболее эффективно преобразовать y в набор (не x).Нам потребуется только один раз просмотреть список, и у нас будет быстрый O (log (n)) доступ к набору.

Все, что вам нужно, это

x filterNot y.toSet
// res1: List[Int] = List(3)

edit:

также есть встроенный метод, который еще проще:

x diff y

(я посмотрел на реализацию; она выглядит довольно эффективно, используя HashMap для подсчета вхождений.)

5 голосов
/ 05 марта 2012

Самый простой способ - вместо этого использовать filter , чтобы удалить нечего;

val existing :List[Int] = 
  x.filter(xInstance => !y.exists(yInstance => yInstance == xInstance))
2 голосов
/ 05 марта 2012
val existing = x.filter(d => !y.exists(_ == d))

Возвращает

existing: List[Int] = List(3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...