【问题标题】:Define map with keys with arbitrary dimension使用任意维度的键定义映射
【发布时间】:2017-07-11 16:42:28
【问题描述】:

以下代码用于为每对 float64 创建一个计数器。
因为映射的键不能是slice,所以我必须使用数组作为键,这迫使我必须用常量定义维度。

counter := make( map[ [2]float64 ] int )
for _, comb := range combinations{ //combinations is a [n][2]float64
    for _, row := range data{  
        counter[ [...]float64{ row[comb[0]] , row[comb[1]] } ]++
    }
}

话虽如此,有没有办法让这个映射依赖于键的长度(依赖于组合的维度?
我尝试使用结构作为键,但据我记得(我可能错了),它有点慢......出于我的目的(将它应用于所有组合〜n!)这不是理想的解决方案。

现在我只考虑大小 2 和 3 的组合,我不得不将其拆分为两个单独的函数,这使我的代码非常冗长且难以维护。 你能找到一种方法来简化它,以便我可以将它扩展到更多维度吗?

感谢您的任何意见

【问题讨论】:

  • 您可以使用[3]float64,并在不使用时将第三个值设置为0(或其他未使用的值)吗?或者使用[4]float64,第一个值是(整数)长度?这些在逻辑上与使用结构相同,但性能可能更高,但代价是更难阅读。
  • 我实际上也完成了 [3]float64 案例。我有一个开关来浏览尺寸。因为我想概括,我也有另一种方法,虽然不是那么快。我将输入数据转换为字符串,然后将其连接起来。它使处理时间加倍。但是,对于某些应用程序,它是有效的 :) 感谢您的输入!

标签: dictionary go key


【解决方案1】:

为什么不使用指向切片的指针作为键?

你可以用make创建一个容量足够大的切片,当你没有超过它的容量时,指针会保持不变。

看看这里https://play.golang.org/p/333tRMpBLv,它体现了我的建议。看到虽然 len

【讨论】:

  • 也许我错过了这个的实现。我打算为切片中的值创建一个计数器。如果我创建一个指向切片的指针,它将始终是一个新值,并且所有条目的计数器都将为 1。有没有我看不到的简单方法?
  • 你可以用make创建一个容量足够大的切片,当你没有超过它的容量时,指针会保持不变。
  • 看看这里play.golang.org/p/333tRMpBLv,它体现了我的建议。看到虽然 len
  • 感谢您的建议。指针似乎保持不变 - 至少从我自己的机器和您提供的沙箱看来是这样。也许在旧的 go 版本中是可能的......
  • Append 将更改指针,如果您向数组添加更多元素,它的容量并且该块中没有更多内存。如果它可以在同一个内存块中扩展,它将不会改变指针。因此,您无法确定在将数组扩展超出其上限时它不会改变。因此,为确保不会发生这种情况,我建议设置足够高的上限。
猜你喜欢
  • 2011-12-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2017-10-11
  • 2012-06-24
  • 2015-06-22
  • 2014-08-16
相关资源
最近更新 更多