【问题标题】:How to filter duplicates by unique key with HashMap in Scala?如何在Scala中使用HashMap通过唯一键过滤重复项?
【发布时间】:2018-07-05 03:20:15
【问题描述】:

我通过创建复合字符串键 (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());
}

【问题讨论】:

标签: java scala


【解决方案1】:

一种方法是使用groupBy

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

【讨论】:

    【解决方案2】:

    这里是一种相对简洁的方式,可以避免构建任何中间 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
    

    对我来说似乎并没有那么清楚。

    【讨论】:

      【解决方案3】:

      这是你想要的,但不是你想要的方式,所以我不确定它是否算作答案。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-10
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-31
        • 2017-04-12
        • 1970-01-01
        相关资源
        最近更新 更多