Как отфильтровать дубликаты по уникальному ключу с помощью HashMap в Scala? - PullRequest
0 голосов
/ 04 июля 2018

Я реализовал простой метод фильтрации в Java, создав составной ключ String (SaleType + SaleDate). Затем я просто помещаю каждую продажу по своему уникальному ключу в HashMap. В результате у меня есть HashMap с продажами, отфильтрованными по ключу SaleType + SaleDate.

Я недавно начал изучать Scala и хочу попробовать ту же логику фильтрации с ним. Как это можно реализовать с помощью возможностей Scala? Я предполагаю, что filter метод может быть использован. Но как я могу создать ключ String из объекта Sale, а затем поместить его в 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());
}

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

В одну сторону можно использовать groupBy

sales.groupBy(s=>s.salesType +s.saleDate).values.map(_.head)
0 голосов
/ 04 июля 2018

Вот относительно лаконичный способ, позволяющий избежать создания промежуточных карт:

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

Это не кажется мне менее ясным.

0 голосов
/ 04 июля 2018

Это делает то, что вы хотите, но не так, как вы хотели, поэтому я не уверен, считается ли это ответом или нет.

sales.map(s => s.saleType + s.saleDate).distinct
0 голосов
/ 04 июля 2018

Вы можете использовать foldLeft, чтобы создать HashMap с некоторой логикой фильтрации, а затем взять значения и преобразовать их в List[Sale]:

sales.foldLeft(new HashMap[String, Sale]())((map, sale) =>
  map + (sale.getSaleType() + sale.getSaleDate() -> sale)
).values.toList
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...