如何对结构体数组按双关键字排序并提取各Symbol的最大Vid
问题:提取每个Symbol对应的最大VID并按Symbol排序
原始数据
arTicker = []; arTicker[1] = { "vid" : 100, "symbol" : "apple" }; arTicker[2] = { "vid" : 101, "symbol" : "dell" }; arTicker[3] = { "vid" : 102, "symbol" : "ibm" }; arTicker[4] = { "vid" : 110, "symbol" : "apple" }; arTicker[5] = { "vid" : 95, "symbol" : "apple" }; arTicker[6] = { "vid" : 115, "symbol" : "samsung" }; arTicker[7] = { "vid" : 121, "symbol" : "dell" }; arTicker[8] = { "vid" : 97, "symbol" : "apple" }; arTicker[9] = { "vid" : 107, "symbol" : "ibm" };
期望输出
apple | 110 dell | 121 ibm | 107 samsung | 115
尝试的代码(未达到预期)
arraySort( arTicker, function (e1, e2){ return compare(e1.symbol, e2.symbol) // && e1.vid < e2.vid; } ); writeDump(arTicker);
解决方案
现有代码仅完成了数组按symbol排序的操作,但没有实现提取每个symbol对应最大vid的核心需求。正确思路是先分组统计最大值,再对结果排序输出。
实现代码
// 1. 分组统计每个symbol的最大vid var symbolMaxVid = {}; for (var item in arTicker) { if (!structKeyExists(symbolMaxVid, item.symbol)) { symbolMaxVid[item.symbol] = item.vid; } else { if (item.vid > symbolMaxVid[item.symbol]) { symbolMaxVid[item.symbol] = item.vid; } } } // 2. 将分组结果转为数组并按symbol排序 var sortedResult = []; for (var symbol in symbolMaxVid) { arrayAppend(sortedResult, { symbol: symbol, maxVid: symbolMaxVid[symbol] }); } arraySort(sortedResult, function(a, b) { return compare(a.symbol, b.symbol); }); // 3. 按格式输出结果 for (var entry in sortedResult) { writeOutput(leftPad(entry.symbol, 10) & " | " & entry.maxVid & "<br>"); }
代码说明
- 分组统计:遍历原始数组,用结构体存储每个symbol的最大vid。若symbol未在结构体中则初始化,已存在则对比更新最大值。
- 排序处理:将结构体的键值对转为数组,通过
arraySort按symbol名称排序。 - 格式化输出:使用
leftPad对齐symbol字段,保证输出格式和预期一致。
内容的提问来源于stack exchange,提问作者Kung Fu Ninja
相关产品推荐
相关产品推荐

