我正在開發一個 scala 腳本,它提供陣列元素的所有不同組合。例如,假設我們有Array(1,3,6,7). 因此,所需的結果應該是:Array((1,3),(1,6),(1,7),(3,6),(3,7),(6,7))
val test : Array[Int] = Array(1,3,6,7)
val result = test.distinct.combinations(2).flatMap{ case Array(a,b) =>
Array((a,b))
}
println(result)
但是此代碼不會列印所需的結果。
編輯
為了增加需要,初始表應該有字串而不是整數(這只是為了操作測驗)。假設我有串列 val test = List("test", "tabdc", "efjh", "hlmn") 并且按照@Luis Miguel Mejía Suárez的建議,我生成了所有組合
val result: List[(String, String)] = List((test,tabdc), (test,efjh), (test,hlmn), (tabdc,efjh), (tabdc,hlmn), (efjh,hlmn))
使用
val result = test.distinct.combinations(2).collect {
case a :: b :: Nil =>
(a, b)}.toList
現在,我應該比較這些代碼生成的每一對,以根據這些規則構造一個字串:
- 當第一部分的最后一個字符等于第二部分的第一個字符時,可以連接兩個部分。
- 合并兩部分時,只保留一份鏈接字符
換句話說:
- 對于這對夫婦
(test,tabdc):我們已經test結束t并tabdc開始了t。所以,他們應該被添加為“testabdc” - 對于這對夫婦
((efjh,hlmn)):我們已經efjh結束h并hlmn開始了h。所以,它們應該被添加為:“efjhlmn”
在這個例子中:最終結果應該是testabdctestabdc(所有連接部分之間的連接)請問我該怎么做?
uj5u.com熱心網友回復:
好吧,這個片段中發生了很多事情。
combinations回傳Iterator本質上是惰性的,這就是為什么您看不到任何輸出的原因;因為它根本沒有計算任何東西。
您可以嘗試通過toArray在末尾添加 a 來解決該問題,但這會給您帶來錯誤的輸出。Arrays不應該使用,尤其是在學習時,它們對于Java互操作和性能調整很有用,但是普通的Scala代碼不應該對這些東西感到疑惑。
不使用的原因串列Arrays包括:它們是可變的,它們是不變的,它們不是集合層次結構的一部分,它們equals是按參考而不是按值,并且它們toString不能很好地列印 ; 的內容Array。這就是為什么toArray在最后添加 a 不能解決問題的原因。因此,我們應該List在任何地方使用。不需要那個
flatMap簡單的map就行了。但是,由于combinations不能保證其輸出的型別安全,collect為了安全起見最好使用。
因此最終的代碼將是:
val test = List(1, 3, 6, 7)
val result = test.distinct.combinations(2).collect {
case a :: b :: Nil =>
(a, b)
}.toList
您可以看到這里運行的代碼。
uj5u.com熱心網友回復:
result是Iterator哪個是惰性的,所以列印的一種方法是使用toSeq例如:
println(result.toSeq) // prints List((1,3), (1,6), (1,7), (3,6), (3,7), (6,7))
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422312.html
標籤:
上一篇:并發流不會向控制臺列印任何內容
