首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Scala中,有没有一种方法可以通过检查数组中的元素来过滤列表中的元素?

在Scala中,有没有一种方法可以通过检查数组中的元素来过滤列表中的元素?
EN

Stack Overflow用户
提问于 2018-08-31 03:12:31
回答 3查看 79关注 0票数 1

我在Scala中有一个列表:

val hdtList = hdt.split(",").toList
hdtList.foreach(println)
Output:
    forecast_id bigint,period_year bigint,period_num bigint,period_name string,drm_org string,ledger_id bigint,currency_code string,source_system_name string,source_record_type string,gl_source_name string,gl_source_system_name string,year string,period string

有一个从dataframe获取的数组,并将其列转换为数组,如下所示:

val partition_columns   = spColsDF.select("partition_columns").collect.flatMap(x => x.getAs[String](0).split(","))
partition_columns.foreach(println)
Output:
source_system_name
period_year

有没有办法从数组中过滤出元素:source_system_name string, period_year bigint,方法是根据hdtListpartition_columns中的元素检查它们,并将它们放入新的列表中。我对在正确的集合上适当地应用过滤器/映射以及对它们进行比较感到困惑。有没有人能告诉我如何才能做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-31 04:02:02

拥有两个列表可能很有用:partition_columns中引用的hdt元素和没有引用的hdt元素。

val (pc
    ,notPc) = hdtList.partition( w =>
                      partition_columns.contains(w.takeWhile(_!=' ')))
//pc: List[String] = List(period_year bigint, source_system_name string)
//notPc: List[String] = List(forecast_id bigint, period_num bigint, ... etc.
票数 1
EN

Stack Overflow用户

发布于 2018-08-31 03:22:51

除非我误解了问题,否则我认为这就是你需要的:

val filtered = hdtList.filter { x =>
  !partition_columns.exists { col => x.startsWith(col) }
}
票数 2
EN

Stack Overflow用户

发布于 2018-08-31 08:08:18

在本例中,您需要使用filter,因为您需要从hdtList中删除元素。

map是一个转换元素的函数,没有办法使用Map从集合中删除元素。如果您有一个X元素列表,那么在执行map之后,您将拥有X个元素,而不是更少,而不是更多。

val newList = hdtList.filter( x => partition_columns.exists(x.startsWith) )

请注意,两个列表之间的组合filter+exists是一个算法NxM。如果你的列表很大,你就会有性能问题。

解决这个问题的一种方法是使用集合。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52103903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档