2014-11-05 51 views
-1

下面代碼比較兩個解釋,並且如果一個元件被包含在另一個列表則該元素被輸出:比較的功能等效的兩個列表

var containList = new scala.collection.mutable.ListBuffer[String]() 
                //> containList : scala.collection.mutable.ListBuffer[String] = ListBuffer() 
    val lines2 = List("2", "3", "4")    //> lines2 : List[String] = List(2, 3, 4) 
    for (l <- lines2) { 
    isStringInFile(l) 
    } 

    def isStringInFile(str: String) = { 
    val lines = List("115", "t2t", "3") 
    for (l2 <- lines) { 
     if (l2.contains(str)) { 
     containList += l2 
     } 
    } 
    }            //> isStringInFile: (str: String)Unit 

    for (c <- containList) { 
    println(c)         //> t2t 
                //| 3 
    } 

這是一個必要的解決方案。但是有沒有功能實現?

回答

1

我喜歡@mohit的解決方案,但您預期的結果從他的一個不同。所以這個代碼工作的例子:

val lines2 = List("2", "3", "4") 
val lines = List("115", "t2t", "3") 

val result = for {l <- lines 
    l2 <- lines2 
    if l.contains(l2) 
} yield l 

result.foreach(println) 

輸出:

t2t 
3 
1

有多種方式做到這一點

scala> val lines2 = List("2", "3", "4") 
lines2: List[String] = List(2, 3, 4) 

scala> val lines = List("115", "t2t", "3") 
lines: List[String] = List(115, t2t, 3) 

scala> lines2.filter(lines.contains(_)) 
res1: List[String] = List(3) 

另一種方法

scala> lines.intersect(lines2) 
res2: List[String] = List(3) 
+0

第一種方法似乎在第二的光,而沒有必要的。 – 2014-11-05 18:31:21

+0

如果列表很大,您應該考慮在相交之前將它們轉換爲Map(.toMap)。當前的解決方案運行時複雜度爲O(n^2);如果你先轉換成地圖,它將是O(n) – Maxim 2014-11-05 19:10:58

+0

@ChrisMartin True。只是想顯示一些簡單的方法,如果OP正在嘗試學習。 – mohit 2014-11-05 19:36:59