You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在D语言中从范围及Record[]数组创建关联数组?

嘿,这个问题问得好!在D语言里从范围(range)创建关联数组其实有挺直接的方式,而且针对你提到的Record[]数组用rec.key做键的场景,标准库还提供了特别方便的工具,咱们一步步来看:

从范围创建关联数组的通用方法

D语言的标准库std.array模块里提供了assocArray函数,它可以直接把键值对组成的范围转换成关联数组。这里的键值对只要是包含key和value成员的类型就行——比如标准库的tuple,或者自定义的结构体。

举个简单的例子:

import std.array;
import std.stdio;
import std.typecons; // 用于tuple

void main() {
    // 用数组模拟一个键值对范围
    auto keyValuePairs = [tuple("apple", 5), tuple("banana", 3), tuple("cherry", 7)];
    // 一键转换为关联数组
    auto fruitCounts = assocArray(keyValuePairs);
    
    writeln(fruitCounts["banana"]); // 输出:3
}
针对Record[]数组的简便实现

如果你有Record[]类型的数组,想要用每个元素的rec.key作为键,只需要结合std.algorithm.map来生成对应的键值对范围,再传给assocArray就搞定了,完全不用手动写循环逐个插入。

场景1:用rec.key做键,整个Record对象做值

import std.array;
import std.algorithm;
import std.stdio;
import std.typecons;

struct Record {
    string key;
    int data;
}

void main() {
    Record[] records = [
        Record{"user1", 100},
        Record{"user2", 200},
        Record{"user3", 300}
    ];
    
    // 转换为关联数组
    auto userMap = records.map!(rec => tuple(rec.key, rec)).assocArray;
    
    writeln(userMap["user2"]); // 输出:Record("user2", 200)
}

场景2:用rec.key做键,只取Record的某个字段做值

如果不需要整个对象,只需要其中的某个字段,修改map的逻辑就行:

// 只取Record的data字段作为值
auto userDataMap = records.map!(rec => tuple(rec.key, rec.data)).assocArray;
writeln(userDataMap["user3"]); // 输出:300

额外提示:处理重复键的情况

要注意的是,如果你的Record[]里有重复的key,assocArray会用最后出现的那个元素覆盖前面的。如果需要把相同键的元素聚合起来,可以用std.algorithm.groupBy配合处理:

import std.array;
import std.algorithm;
import std.stdio;
import std.range;

void main() {
    Record[] records = [
        Record{"user1", 100},
        Record{"user1", 150},
        Record{"user2", 200}
    ];
    
    // 把相同key的data字段收集到数组里
    auto groupedUserMap = records
        .groupBy!(rec => rec.key) // 按key分组
        .map!(group => tuple(group.key, group.value.map!(r => r.data).array)) // 提取每组的data并转为数组
        .assocArray;
    
    writeln(groupedUserMap["user1"]); // 输出:[100, 150]
}

总结一下,核心就是利用标准库的assocArray和map组合,快速完成转换——标准库已经帮我们封装好了大部分常用场景,省心又高效!

内容的提问来源于stack exchange,提问作者Danol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:17:32