2016-11-08 64 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