如何在IBM EGL中按日期、安装员编号、时段降序排序数组?
IBM EGL 实现 FreelanceOrderRec 数组多字段降序排序
核心实现思路
EGL中对数组排序依赖SortLib.sort()函数,需自定义比较函数来实现date→installerNr→partOfDay的三级降序逻辑。比较函数返回规则:
- 负数:第一个参数应排在第二个参数之前
- 正数:第二个参数应排在第一个参数之前
- 0:两个元素排序优先级相同
完整代码实现
1. 自定义比较函数
function compareOrders(a FreelanceOrderRec, b FreelanceOrderRec) returns (int) // 第一优先级:date 降序 if (a.date > b.date) return -1; else if (a.date < b.date) return 1; end // 第二优先级:installerNr 降序 if (a.installerNr > b.installerNr) return -1; else if (a.installerNr < b.installerNr) return 1; end // 第三优先级:partOfDay 排序 // 情况1:按字符串原生降序("Not Known." 会排在最前) return compareStrings(b.partOfDay, a.partOfDay); // 情况2:按业务时段优先级降序(3→2→1→Not Known.),取消注释下方代码并注释上方行 // return comparePartOfDay(a.partOfDay, b.partOfDay); end // 可选:按业务逻辑处理partOfDay排序的辅助函数 function comparePartOfDay(a string, b string) returns (int) aKey = getPartOfDayKey(a); bKey = getPartOfDayKey(b); if (aKey > bKey) return -1; else if (aKey < bKey) return 1; end return 0; end function getPartOfDayKey(part string) returns (int) case part when "1 (08:00-13:00)" return 3; when "2 (11:00-15:00)" return 2; when "3 (13:00-17:00)" return 1; when "Not Known." return 0; otherwise return 0; end end
2. 执行排序
在业务代码中调用排序函数,传入目标数组和自定义比较函数:
// 对无序数组freelanceOrderRecs执行排序 SortLib.sort(freelanceOrderRecs, compareOrders);
关键逻辑说明
- date降序:直接比较date类型值的大小,通过返回值控制排序顺序;
- installerNr降序:同理,基于int类型的数值比较实现降序;
- partOfDay排序:
- 原生字符串降序:借助EGL内置
compareStrings()函数,按字符串ASCII码值降序排列,此时"Not Known."会因首字符ASCII值大于数字排在最前; - 业务逻辑排序:通过辅助函数将时段映射为优先级数值,实现3时段→2时段→1时段→未知时段的降序,更贴合业务需求。
- 原生字符串降序:借助EGL内置
内容的提问来源于stack exchange,提问作者Laurens Wolf
相关产品推荐
相关产品推荐

