2016-08-30 66 views
2

對不起,新手問題。我嘗試實施蟒蛇issuperset()使用Scala類如何在Scala中實現Python的issuperset()

Python的例子:

weighted_fruits_set = {"banana", "orange","apple"} 
check = {"banana"} 
weighted_fruits_set.issuperset(check) 

Python的答案:"True"

我的Scala代碼下面,我試圖contains從的case class weightedFruits列表中找到superset我檢查字符串"banana"存在於weightedFruits.name中:

object Learn extends App { 


    case class weightedFruits(name:List[String], weight:Double) { 
override def toString = s"name: ${name.mkString("<", ",", ">")}, weight: $weight\n" 
} 

var weightedFruitsList = new scala.collection.mutable.ListBuffer[weightedFruits]() 

weightedFruitsList += ( 
        weightedFruits(List("banana","orange"),180), 
        weightedFruits(List("banana","orange","apple"),170),         
        weightedFruits(List("feijoa","fig"),201), 
        weightedFruits(List("banana","apple","melon"),165) 
        ) 

val check = weightedFruits(List("banana"),200)      

weightedFruitsList += check      

val item = weightedFruitsList(1) 

val bol:Boolean = item.name.contains(check.name) 

println("item: "+item) 
println("check: "+check) 
println("bool: "+bol) 

} 

我的代碼的輸出是false(但必須是true):

item: name: <banana,orange,apple>, weight: 170.0 

check: name: <banana>, weight: 200.0 

bool: false 

感謝您的幫助。我真的希望我的解釋是明確

+0

正如我理解你的問題,'issuperset'意思是: def f [A](list1:List [A],list2:List [A]):Boolean'其中'true'表示' list1'包含所有'list2'的元素,否則'false'?所以'f(List(1,2,3),List(1))=== true',但是'f(List(1,2,3),List(4))=== false'? –

+1

'.contains'在你的情況下需要一個元素,而不是一個列表'List(「banana」,「orange」)。contains(List(「banana」))== false' –

回答

2
def isSuperSet[A](a: Set[A])(b: List[A]) = b.forall(a.contains(_)) 

上述函數返回true如果a是水果b

轉換列表的超集Set(僅),然後使用此功能。

+0

你不需要'b'成爲'Set',甚至對於'a',只有你有很長的列表纔是重要的。最後一條語句是錯誤的,請注意OP中的'.name'。 –

+0

@VictorMoroz感謝您的支持。編輯答案。 – pamu

+0

@VictorMoroz善於觀察 – pamu

4

在我看來,其他目前的答案是做得比他們需要的多。如果集合A是集合B的一個子集,那麼A的所有元素都在B中。因此,如果我們從A中移除B的所有元素,則不應該有任何剩餘。所以

val a = List("banana") 
val b = List("banana", "orange","apple") 
val c = List("tomato") 

(a diff b).isEmpty        //> true 
(c diff b).isEmpty        //> false 

(不指定如果任一「套」包含重複會發生什麼)

如果你實際使用集,而不是列表,這個操作已經在標準庫

def subsetOf(that: GenSet[A]): Boolean 

測試此集是否是另一個集的子集。即設置爲 測試。如果此集合是一個子集,也就是說,如果這一套每 元素也是那

Scaladoc here

所以,你可以在「設置」轉化爲實際的設置與.toSet元素返回true ,並使用這個

+0

這種方法唯一的問題是您創建了一箇中間列表(希望爲空),而實際上您只需要一個布爾值在場景後面有'HashMap',但那部分可能是不可避免的)。即使結果已經定義,它也會掃描整個左側列表。 –

+0

當然,你可以讓它變得更快。但它很簡短,清晰,並且易於演示正確的作品。一旦代碼正常工作,測量顯示這是一個重要的時間消費者,那麼它可以被優化。此外,中間列表至多是子集的長度。 –

+0

感謝@The原型保羅詳細的解釋和提及'設置' – Toren