【问题标题】:Retrieve many values associated with the given key at once using Scala使用 Scala 一次检索与给定键关联的多个值
【发布时间】:2020-10-25 06:40:02
【问题描述】:

我有一个包含数百个元素的地图,我想一次检索许多与给定键关联的值。

例子:

Map(t1 -> 1),(t2 -> 2),.....(t340 ->340)

我知道我可以使用 apply 方法,但我试图一次检索 50 个值,这会使代码看起来像:

val a = map.apply("t1","t2","t3","t4","t5","t6"...."t50) 

还有其他方法可以让我使用 apply 方法或 scala 地图集合的其他方法一次检索多个值吗?

【问题讨论】:

  • 如果您一次检索多个值(每次尝试都可能失败),结果不也是...集合吗?
  • 您有密钥集合吗?还是只是可变参数?地图中不存在的键会发生什么?我看到了三种选择: 1. OptionsList,每个键一个。 - 2. ListOption,如果至少有一个元素丢失,则整个操作被中止。 - 3. 仅包含找到的值的列表。 - 你想要这三种选择中的哪一种?
  • filtering 映射您想要的值怎么样?

标签: scala scala-collections


【解决方案1】:

根据您期望的输出类型,可以通过多种不同的方式完成。

如果您希望收集,您可以执行以下操作:

val keys: List[String]
keys.flatMap(map.get) // List[Int]

你会得到一个根据键排序的值列表,但如果键没有值,它将被跳过。

如果您需要集合中的值并且顺序将无关紧要

val keySet = keys.toSet
map.filter(p => keySet(p._1)).values

应该够了。

另一种选择是:

keys.map { k =>
  k -> map.get(k)
}

为了避免丢失哪些值存在哪些不存在的信息。虽然这在实践中并没有太大的不同,而不仅仅是:

map.filter(p => keySet(p._1))

如果您期望固定数量的键,并且所有键都必须存在,那么我只能将其视为:

for {
  a1 <- map.get(k1)
  a2 <- map.get(k2)
  ...
  an <- map.get(kn)
} yield (a1, a2, ..., an)

这将返回元组的选项。这可以使用 Cats 以更漂亮的方式编写,例如

(map.get(k1), map.get(k2), ..., map.get(kn)).tupled

虽然大多数扩展方法(和元组)最多支持 22 个参数,但我只能看到使用集合解决 50 个键的问题。 (或者很长的理解产生自定义的 50 字段案例类)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多