【问题标题】:Scala groupby Element typeScala groupby 元素类型
【发布时间】:2015-11-28 21:38:51
【问题描述】:

我编写了一个 textparser,它使用包含类型列表的 n 个解析器(通过对 n 个样本进行训练而生成)解析给定的一段文本

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

请注意,每个对象都有参数(假设在这种情况下,它们都有相同的参数,名为param),其值可能会有所不同。我的目标是减少列表以删除常见的解析器(即具有相同参数的对象)以供进一步处理和使用。为了达到同样的效果,我正在考虑将相同类型的元素分组,然后减少这些组中的每一个。但是我不确定如何 groupBy 使用类型。任何关于相同的建议/指针都会有所帮助(或者如果有更好的功能性方法来解决问题)。

【问题讨论】:

    标签: list scala collections types


    【解决方案1】:

    您可以只使用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))

    【讨论】:

    • 好的,谢谢,_.getclass 成功了,但我无法进一步使用类型信息来处理每个具有模式匹配的组(收到类型擦除警告)-我猜ClassTag 和 TypeTag 可用于相同的用途(需要阅读此内容)。以上只是一个小问题,ClassTag(x.getClass).tpe 是否正确?我没有看到 Classtag @scala-lang.org/files/archive/nightly/docs/library/… 的 tpe 值成员
    • @Ark 糟糕,我正在并行试验TypeTags,tpe 仅对他们正确。修正了答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多