为了账号安全,请及时绑定邮箱和手机立即绑定

如何在Scala中使用HashMap通过唯一键过滤重复项?

如何在Scala中使用HashMap通过唯一键过滤重复项?

忽然笑 2021-04-26 17:18:00
我已经通过创建复合字符串键(SaleType + SaleDate)在Java中实现了一种简单的过滤方法。然后,我将每个销售通过其唯一的密钥放入HashMap。结果,我有一个HashMap,其销售额由SaleType + SaleDate键过滤。我最近开始学习Scala,并希望尝试相同的过滤逻辑。如何使用Scala机会实现这一目标?我想filter可以使用一种方法。但是,如何从Sale对象构造一个String键,然后将其放入uniqueSalesMap?private static List<Sale> getUniqueSales(List<Sale> sales) {    Map<String, Sale> uniqueSalesMap = Maps.newHashMap();    for (Sale sale : sales) {        String saleKey = sale.getSaleType() + sale.getSaleDate();        uniqueSalesMap.put(saleKey, sale);    }    return new ArrayList<Sale>(uniqueSalesMap.values());}
查看完整描述

3 回答

?
茅侃侃

TA贡献1842条经验 获得超21个赞

一种方法是使用 groupBy

sales.groupBy(s=>s.salesType +s.saleDate).values.map(_.head)


查看完整回答
反对 回复 2021-05-12
?
MMMHUHU

TA贡献1834条经验 获得超8个赞

这是一种避免构建任何中间Map的相对简洁的方法:


import collection.breakOut


val m: Map[String, Sale] = 

  (for (s <- sales) yield (s.getSaleType + s.getSaleDate, s))(breakOut)


m.values.toList

但老实说,与原始Java代码相比,我看不出太多优势。你可能已经写了


val m = collection.mutable.HashMap.empty[String, Sale]

for (s <- sales) {

  m(s.getSaleType + s.getSaleDate) = s

}

m.values.toList

对我来说似乎还不那么清楚。


查看完整回答
反对 回复 2021-05-12
?
烙印99

TA贡献1829条经验 获得超13个赞

这可以实现您想要的功能,但不会以您想要的方式进行,因此我不确定它是否可以作为答案。

sales.map(s => s.saleType + s.saleDate).distinct


查看完整回答
反对 回复 2021-05-12
  • 3 回答
  • 0 关注
  • 251 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信