Wren语言中的Map数据结构详解

Wren语言中的Map数据结构详解

wren The Wren Programming Language. Wren is a small, fast, class-based concurrent scripting language. wren 项目地址: https://gitcode.com/gh_mirrors/wr/wren

什么是Map

Map(映射)是Wren语言中一种非常重要的关联性集合数据结构。它由一组键值对(entry)组成,每个entry将一个键(key)映射到一个值(value)。这种数据结构在不同编程语言中有不同的名称:哈希表(hash table)、字典(dictionary)、关联数组(association)等。

创建Map

在Wren中创建Map非常简单,使用花括号{}包裹一系列用逗号分隔的键值对,每个键值对用冒号:分隔:

{
  "maple":  "Sugar Maple (Acer Saccharum)",
  "larch":  "Alpine Larch (Larix Lyallii)",
  "oak":    "Red Oak (Quercus Rubra)",
  "fir":    "Fraser Fir (Abies Fraseri)"
}

这个例子创建了一个将树种类型(键)映射到该科特定树种(值)的Map。

键和值的类型限制

键的类型限制

Wren对Map的键有特定限制,键必须是以下不可变的值类型之一:

  • 数字(number)
  • 字符串(string)
  • 范围(range)
  • 布尔值(bool)
  • null值
  • 类对象(class object,注意是类本身而非类的实例)

这种限制源于Map的底层实现原理:Map使用哈希表结构,需要通过键计算哈希码来快速定位值。Wren只为上述内置类型提供了哈希计算能力。

值的类型

相比之下,值的类型限制要宽松得多:

  • 可以是任意对象
  • 允许多个键映射到同一个值

Map的基本操作

添加元素

使用下标运算符[]可以添加新的键值对:

var capitals = {}
capitals["Georgia"] = "Atlanta"
capitals["Idaho"] = "Boise"
capitals["Maine"] = "Augusta"

如果键已存在,则会更新对应的值;如果不存在,则添加新的键值对。

查找元素

同样使用下标运算符查找值:

System.print(capitals["Idaho"]) // 输出: Boise

当键不存在时返回null。由于null本身也可以作为值存在,因此不能单纯通过返回值是否为null判断键是否存在。这时可以使用containsKey()方法:

var capitals = {"Georgia": null}

System.print(capitals["Georgia"]) // null (键存在)
System.print(capitals["Idaho"])   // null 
System.print(capitals.containsKey("Georgia")) // true
System.print(capitals.containsKey("Idaho"))   // false

获取元素数量

使用count属性获取Map中的键值对数量:

System.print(capitals.count) // 3

删除元素

使用remove()方法删除指定键的键值对:

capitals.remove("Maine")
System.print(capitals.containsKey("Maine")) // false

remove()会返回被删除键对应的值,如果键不存在则返回null

要清空整个Map,使用clear()方法:

capitals.clear()
System.print(capitals.count) // 0

遍历Map

Wren提供了多种遍历Map的方式,但需要注意遍历顺序是不确定的。

直接遍历键值对

使用for-in循环直接遍历Map,每次迭代会得到一个包含keyvalue字段的entry对象:

var birds = {
  "Arizona": "Cactus wren",
  "Hawaii": "Nēnē",
  "Ohio": "Northern Cardinal"
}

for (bird in birds) {
  System.print("The state bird of %(bird.key) is %(bird.value)")
}

通过keys遍历

先获取所有键,再逐个查找值:

for (state in birds.keys) {
  System.print("The state bird of %(state) is " + birds[state])
}

通过values遍历

如果只需要值而不关心键,可以直接遍历值:

for (bird in birds.values) {
  System.print("Found bird: " + bird)
}

实际应用建议

  1. 键选择:尽量使用简单、不可变的值作为键,如字符串或数字,这能保证最佳性能。

  2. 存在性检查:当需要确认键是否存在时,优先使用containsKey()而非检查值是否为null

  3. 遍历性能:在大型Map中,直接遍历比先获取keys再逐个查找更高效。

  4. 内存管理:不再使用的Map应及时清空或置为null,特别是在处理大量数据时。

通过深入理解Wren中Map的特性和操作方式,开发者可以更高效地处理各种需要键值关联的场景,从简单的配置存储到复杂的数据索引都能得心应手。

wren The Wren Programming Language. Wren is a small, fast, class-based concurrent scripting language. wren 项目地址: https://gitcode.com/gh_mirrors/wr/wren

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贡沫苏Truman

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值