2011-06-05 94 views
0

有一個有序的字符串列表與另一個列表進行比較,我決定實現一個作爲一個地圖在與關鍵字是字符串的第一個字符串和值的字符串列表具有相同的第一個字符。 總之我有什麼,因爲這:優雅的地圖實現

var list1:Map[Char, List[String]] = Map('a' -> List("alone", "away")) 
var list2:List[String] = List("I", "am", "alone", "at", "home", "watching", "batman", "XD") 

現在,在實現我的代碼這種方式,它是「硬」他們試圖要考慮的第一個作爲一個簡單的列表來工作,所以我在想,如果還有另一種更優雅的方式來解決這個問題。 如果我必須驗證list1是否具有「單獨」,我必須先獲取關鍵字'a',然後調用包含的方法。我必須執行這樣的事情。

if (list1("alone".charAt(0)).contains("alone")) ... 

這是醜陋不得不每次提取密鑰,然後比較清單,我想創建一個引擎蓋下實現這個新的地圖(或清單)(它會自動提取關鍵和然後在列表上工作)。 你有什麼建議? 謝謝。

編輯:我重寫了部分問題,澄清了一些觀點。 第一個列表是有序的,第二個沒有。

+0

你有一個有序的字符串列表嗎?或者是一個有序的String列表?爲什麼你有這個狡猾的地圖?爲什麼不使用簡單的列表? – 2011-06-05 16:47:46

+0

那麼,我有一個有序的字符串列表,我這樣實現我的代碼相信它可以更快地做搜索和替換以及其他一些事情。我的意思是,在所有列表中搜索較小的列表會更快,否? – DDB 2011-06-05 16:53:31

+0

你可能最好使用'Vector'。這樣的操作相當高效。 – 2011-06-05 17:03:27

回答

4

從我所見過的所有你真的只想要一個清單。所以使用一個List。 (或可能是SortedSet)

您似乎關注性能,但您既沒有說明哪種算法的哪一部分要放慢速度,也沒有說明它需要多快,也沒有提供您合理的參數選擇確實符合這些性能要求。再說一遍:只需使用List。然後衡量表現。如果真的要放慢速度,可以在這裏發佈代碼和結果,並說明需要多快。

然後人們將能夠提供幫助。

+0

我同意,我沒有注意到還有一個HashSet ...你知道,當你來自腳本語言(autoit)時,你不能期望知道所有的東西。感謝您的建議。再見。 – DDB 2011-06-05 19:39:29

0

我不知道爲什麼使用地圖將幫您比較字符串列表,但無論如何:

如果你不介意使用一個可變的集合,你確定你的列表中有沒有重複(當您使用集合操作

import scala.collection.mutable._ 
val mm = new HashMap[Char,Set[String]] with MultiMap[Char,String] 
Seq("alone","away").foreach(s => mm.addBinding(s(0),s)) 

scala> mm 
res2: scala.collection.mutable.HashMap[Char,scala.collection.mutable.Set[String]] 
with scala.collection.mutable.MultiMap[Char,String] = 
Map(a -> Set(alone, away)) 

scala> mm.entryExists('a',"alone") 

不幸的是,multimappedness消失(這只是一個普通的地圖從CharSet[String]當時):所以你其實可以使用一組),那麼你可以使用MultiMap特質。

+0

我想解決('a',「alone」)部分......我想做一些與mm.contains(「獨自」)一樣的東西,它會自動執行(「單獨」.charAt(0)).contains(「單獨」)... – DDB 2011-06-05 17:01:07

+0

@DDB - 如果您從未真正需要「a」本身,我認爲這是一個清楚的跡象表明您沒有采取正確的方法來解決您的問題。此外,不要忘記你可以只有'def(m:Map [Char,List [String]],s:String)= if(s.length> 0)m.get(s.charAt(0))。 map(_包含s).getOrElse(false)else false「,然後使用它來代替每次輸入整個混亂。 – 2011-06-05 17:09:30

+0

也許我可以使用隱式def來解決問題...我沒有這樣想... – DDB 2011-06-05 17:25:07