2010-09-06 16 views
14

varsayalım Ben İki liste bul d '). Bunu bir döngü ile yapabileceğimi biliyorum, ancak bunu tek bir satırda hızlıca yapmanın işlevsel bir yolu var mı?(scala olarak) ikinci listede olmayan bir listede elemanları

Scala List API'sine bakıyorum, ancak yalnızca birleşim ve kesişim bulundu (bana bir liste verecek ('a', 'b', 'c', 'd') ve List ('a ',' b ',' c ')))

cevap

12

b -- a'u kullanabilirsiniz.

kaldırılan yöntem için
def -- [B >: A] (that: List[B]) : List[B] 
Computes the difference between this list and the given list that. 
that 
the list of elements to remove from this list. 
returns this list without the elements of the given list that. 
deprecated: use list1 filterNot (list2 contains) instead 

Maalesef burada mevcut iyi biridir: Burada scala gelen belgelerdir list1 filterNot (list2 contains)

def filterNot (p: (A) ⇒ Boolean) :

Liste [A] seçer bu listedeki tüm unsurlarını Bir yüklemi tatmin etmeyen. , test öğelerinde kullanılan yüklemi. , bu listenin öğesinden oluşan yeni bir listeyi döndürerek, belirtilen yüklemeyi karşılamamaktadır. Elemanların sırası korunur. tanım sınıfları: TraversableLike

+0

Teşekkürler, işe yarıyor! 2.8 dışında, görünüşe göre, kullanımdan kaldırıldığını ve aşamalı olarak kaldırılacağını söylediler: OutputTree.scala: 136: metot - sınıfta Liste kullanımdan kaldırıldı: 'list1 filterNot (list2 şunu içerir)' yerine –

+1

ah değersizleştirme notunu kopyalayıp yapıştırabilirsiniz! Benim hatam! =) –

+0

Endişelenmeyin, kullanımdan kaldırılan çizgiyi gerçekten görmüyorum, sadece tümünü kopyayorum :) – vodkhang

18

Bunun için diff kullanabilirsiniz:

scala> b diff a 
res1: List[Char] = List(d) 

Muhtemelen diff yapıyorsanız Set ile çalışmak istiyoruz.

0

Elbette, bu pek çok şekilde yapılabilir. Sayıları ve dizeleri diff gibi düz yapılar için en şık olanıdır. Diğer yollar şunlardır:

val ans1 = for { x <- b if !a.contains(x) } yield x 

val ans2 = for { x <- b if !a.exists(_ == x) } yield x 

val ans3 = b filterNot (x => b.contains(x)) 

val ans4 = b diff a