2016-11-08 98 views
0

如何確保列表只包含特定的一組項目?確保列表僅包含特定值

List[Int] 

,以確保該列表只包含值10,20或30 我敢肯定,這是建立在由我找不到它的功能!

+0

如果您認爲您的問題已解決,請考慮接受答案。如果不是的話,那麼對那些幫助他們將答案提高到可接受水平的人發表評論。它幫助每個人。 – maasg

+1

你想確保你只能添加某些項目到列表中?列表可能只包含特定項目,或者檢查給定列表是否包含特定時間點的某些項目。 3種不同答案的選項。 – maasg

回答

1

你的問題沒有指定你想要什麼當列表不包含必要項目時發生。

如果列表中的所有項目符合您的條件下將返回true,否則爲false:

val ints1: List[Int] = List(1, 2, 3, 4, 5, 6, 7) 
val ints2: List[Int] = List(10, 10, 10, 10) 

ints1.forall(i => List(10, 20, 30).contains(i)) // false 
ints2.forall(i => List(10, 20, 30).contains(i)) // true 

下面將返回一個列表,只有那些符合標準的項目:

val ints1: List[Int] = List(10, 20, 30, 40, 50, 60, 70) 
val ints2: List[Int] = List(10, 10, 10) 

ints1.filter(i => List(10, 20, 30).contains(i)) // List(10, 20, 30) 
ints2.filter(i => List(10, 20, 30).contains(i)) // List(10, 10, 10) 
2

FORALL

您可以使用forall含有能有效或合法元素集,並且希望在列表中看到的。

list.forall(Set(10, 20, 30).contains) //true means list only contains 10, 20, 30 

是集功能

你不必使用contains方法Set延伸Int => Boolean。您可以使用設置的功能等

list forall Set(10, 20, 30) 

過濾

您可以使用過濾器來過濾掉不屬於在給定列表中的元素。再次,您可以使用Set as Function作爲Set extends Function。

list.filter(Set(10, 20, 30)).nonEmpty //true means list only contains 10, 20 and 30 

收藏,如果你喜歡的模式匹配

收集需要的部分功能。如果你喜歡的模式匹配只使用collect

list.collect { 
    case 10 => 10 
    case 20 => 20 
    case 30 => 30 
}.nonEmpty //true means list only contains 10, 20 and 30 

斯卡拉REPL

scala> val list = List(10, 20, 30, 40, 50) 
list: List[Int] = List(10, 20, 30, 40, 50) 

scala> list forall Set(10, 20, 30) 
res6: Boolean = false 
+3

問題是要求如何驗證列表_only_包含值'10','20'和'30'。爲此,我們需要額外增加一個步驟,並寫入'list.filterNot(Set(10,20,30).contains(_))。isEmpty'來驗證不包含的元素列表因爲'Set'是空的。 – Eric

0

如果你只是想確定所有在列表中的值是否爲「合法」,使用FORALL

def isLegal(i: Int): Boolean = ??? // e.g. is it 10, 20, or 30 
val allLegal = list forall isLegal 

如果你想減少你的清單,只剩下合法的價值,我們Ë過濾

val onlyLegalValues = list filter isLegal 

注意,一個Set[Int]算作一個Int => Boolean功能,因此您可以使用到位您isLegal方法:

val isLegal = Set(10, 20, 30) 
val allLegal = list forall isLegal 
val onlyLegalValues = list filter isLegal