language-agnostic - 如何访问字典或哈希中的第 n 个项目?

标签 language-agnostic dictionary hashmap

我有一个键和值的字典,例如:

{
    fred: 1,
    dave: 2,
    lily: 3
}

在这种情况下,如何获取字典中的第二个元素 - {dave:2}

背景:我已经看到这个问题以一种或另一种形式在 SO 上被问了很多次,
所以我想我会写一个问答页面作为社区维基,人们可以
提到并有望成为这个问题的规范答案。

此问答适用于字典,因为它们在许多不同的版本中实现
语言。不同的语言使用不同的名称来指代什么
本质上是相同的数据结构——例如它们在
Perl,Python 中的字典。在 Objective-C 中,它们是NSDictionaryNSMutableDictionary 类。

最佳答案

简而言之,你不能 - 因为字典是无序的
键/值对的集合。填充字典的顺序
不保留在内存中。这是 Python 中的一个简单示例:

>>> dict = { 'a': 1, 'b': 2, 'c': 3 }
>>> dict # show the value of dict in memory
{'a': 1, 'c': 3, 'b': 2}

如您所见,虽然字典是用键初始化的
顺序 a, b, c, 打印字典的值显示它们
订购 a、c、b。甚至那个顺序也不会保留在内存中;
当您向字典中添加更多键/值对时,
上面的表达式会不断变化。

为什么是这样?

字典针对快速存储和检索值进行了优化
基于唯一键。实现从一种语言到
接下来,但通常它的工作原理是这样的:
  • 字典由 N 个元素的标准数组支持
  • 在存储键/值对时,键通过一个函数传递
    将它转换成一个整数(一个“散列函数”——因此得名
    Perl 中此数据结构的“散列”)。一个简单的哈希函数
    对于 ASCII 字符串键可能是将每个的 ASCII 值相加
    特点。 (注意:这不是一个好的散列算法——只是一个
    一个简单的例子!)
  • 然后将整数除以数组的大小,余数
    该除法的值用作数组
  • 的索引
  • 如果该索引处的数组元素已经填充,则
    使用多种技术中的一种来解决冲突(例如
    数组元素的内容本身就是一个数组
    附加了新值及其未散列的键)
  • 检索的工作方式与存储相同:获取 key ,用它来
    派生一个数组索引,然后检索与该索引关联的值
    关键
  • 后备数组可以随着字典的增长而调整大小:在调整大小时
    数组,字典中的每个元素都有其哈希值除以
    新的数组大小,产生一个新的余数,即一个新的位置
    在支持数组中。
  • 关于language-agnostic - 如何访问字典或哈希中的第 n 个项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4634223/

    相关文章:

    java - mybatis中动态使用HashMap进行参数映射

    algorithm - 是否可以创建一个生成自动图的算法?

    python - 在字典列表中查找重复索引

    vb.net - 尝试使用 Catch 显示输入错误消息

    java - 哪个是 HashMap 的更好选择?

    java - 计算相同项目频率的数据结构

    arrays - 删除和移动数组元素

    language-agnostic - "program to an interface"是什么意思?

    language-agnostic - 是否应在编程语言中删除或更改隐式八进制编码?

    algorithm - 将STL映射转换为基于数值的键排序列表的好算法