2015-09-03 97 views
2

我有寫,它解析給定的片,其被包含在類型Scala的GROUPBY元素類型

List(Parser1_Object, Parser2_Object, Parser1_Object, Parser3_Object,....)

注意,每個列表使用文本Ñ解析器(由訓練過n個樣本產生的)的textparser對象有參數(假設在這種情況下,所有參數都有相同的參數,名稱爲param),其值可能會有所不同。我的目標是減少列表以刪除常見的解析器(即具有相同參數的對象)以供進一步處理和使用。爲了達到同樣的目的,我正在考慮將相同類型的元素進行分組,然後努力減少這些組中的每一個。但我不確定如何groupBy與類型。任何建議/指針都是有幫助的(或者如果有更好的功能方法來解決這個問題)。

回答

2

您可以只用運行時類型使用getClass到組對象:

scala> val l = List(1, 2, "1", "2", 2.0, 3.0) 
l: List[Any] = List(1, 2, 1, 2, 2.0, 3.0) 

scala> l.groupBy(_.getClass) 
res0: scala.collection.immutable.Map[Class[_],List[Any]] = 
    Map(class java.lang.String -> List(1, 2), 
     class java.lang.Double -> List(2.0, 3.0), 
     class java.lang.Integer -> List(1, 2)) 

你也可以把它包裝成scala.reflect.ClassTag,像l.groupBy(x => ClassTag(x.getClass))

+0

好吧,謝謝__getclass做了詭計,但我無法進一步使用類型信息來對這些組進行模式匹配(對類型擦除有警告) - 我猜測ClassTag和TypeTag可以是用於相同的(需要閱讀此)。上面的一個小問題是'''ClassTag(x.getClass).tpe''正確嗎?我沒有看到tpe值成員Classtag @ http://www.scala-lang.org/files/archive/nightly/docs/library/index.html#scala.reflect.ClassTag – Ark

+0

@Ark哎呀,我正在試驗與'TypeTag's並行,'tpe'只對他們是正確的。修復了答案。謝謝! – dk14