【问题标题】:Scala - distinct on list, but with a pick order / priorityScala - 在列表中不同,但有选择顺序/优先级
【发布时间】:2018-02-07 00:35:07
【问题描述】:

给定一个案例类列表:

case class Entity(name: String, priority: Int)

找到所有独特的人的好方法是什么,但只选择最高优先级的条目(优先级 1 被认为高于 2),这样:

val l = Seq(Entity("Alex",20), Entity("Alex",3), Entity("Bob", 28)) 

变成

Seq(Entity("Alex", 3), Entity("Bob", 28))

【问题讨论】:

  • 我的错,我想优先级更像是“排名”,其中 1 > 2 > 3

标签: scala collections


【解决方案1】:
  • 按名称分组,以及
  • 按排名排序
  • 挑头

例子,

scala> case class Entity(name: String, priority: Int)
defined class Entity

scala> val input = Seq(Entity("Alex",20), Entity("Alex",3), Entity("Bob", 28), Entity("UPD", 100), Entity("UPD", 100))
input: Seq[Entity] = List(Entity(Alex,20), Entity(Alex,3), Entity(Bob,28), Entity(UPD,100), Entity(UPD,100))

scala> input.groupBy(_.name).map(_._2.sortBy(_.priority).head)
res5: scala.collection.immutable.Iterable[Entity] = List(Entity(UPD,100), Entity(Bob,28), Entity(Alex,3))

有效的方法是获得排名最低的那个,因为您不需要对整个序列进行排序。

scala> input.groupBy(_.name).map(_._2.minBy(_.priority))
res6: scala.collection.immutable.Iterable[Entity] = List(Entity(UPD,100), Entity(Bob,28), Entity(Alex,3))

类似问题:

How to get min by value only in Scala Map

how to sort a scala.collection.Map[java.lang.String, Int] by its values?

【讨论】:

  • 太棒了!谢谢! intelliJ 告诉我您可以使用 minBy() 进一步简化它,但非常感谢
  • minBy 实际上是一个不错的方法,因为您只关心最小值,因此没有对整个序列进行排序的开销。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多