为了账号安全,请及时绑定邮箱和手机立即绑定

有没有办法从地图中删除第一个元素?

有没有办法从地图中删除第一个元素?

Go
沧海一幻觉 2023-08-21 14:55:06
我可以删除地图中的第一个元素吗?切片是可能的slice = append(slice, slice[1:]...),但是我可以用地图做这样的事情吗?
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

作为哈希表的映射没有指定的顺序,因此无法按定义的顺序删除键,除非您按照添加键的顺序在单独的切片中跟踪键,如下所示:


type orderedMap struct {

    data map[string]int

    keys []string

    mu *sync.RWMutex

}


func (o *orderedMap) Shift() (int, error) {

    o.mu.Lock()

    defer o.mu.Unlock()

    if len(o.keys) == 0 {

        return 0, ErrMapEmpty

    }

    i := o.data[o.keys[0]]

    delete(o.data, o.keys[0])

    o.keys = o.keys[1:]

    return i, nil

}

为了明确说明为什么不能真正从地图中删除“第一个”元素,让我参考一下规范:

映射是一种类型(称为元素类型)的无序元素组,由另一种类型(称为键类型)的一组唯一键进行索引。未初始化的映射的值为 nil。

添加了对地图项无序这一事实的强调

不过,从根本上来说,使用切片来保留键顺序的一些概念是有缺陷的。给定这样的操作:

foo := map[string]int{

    "foo": 1,

    "bar": 2,

}

// a bit later:

foo["foo"] = 3

索引/键foo现在是否已更新或重新分配?是否应该将其视为新条目,附加到 if 键的切片中,还是就地更新?事情很快就会变得混乱。问题的简单事实是,地图类型不包含事物的“顺序”,试图使其具有顺序很快就会变成一项劳动密集型任务,最终您将编写自己的类型。

正如我之前所说:它是一个哈希表。例如,如果用于键的哈希算法产生冲突,则其中的元素会在幕后重新洗牌。这个问题有点像 XY 问题:为什么需要对地图中的值进行排序?也许地图根本不是解决您的特定问题的正确方法。


查看完整回答
反对 回复 2023-08-21
  • 1 回答
  • 0 关注
  • 80 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信