GeneXus笔记本——关于GeneXus中一种键值对数组的使用
如题 ,环境Gx16U6 版本号16.0.136889 .Net 在 GeneXus中的 Key Value组合类似于HashMap这种键值对参考资料如下Properties Data Type (X Evolution 3) | Article (genexus.com)首先新建一个变量 类型为Properties 然后创建Key值和Value值 使用Set方法进行填充 如下图
然后 查看Log日志如下
使用此属性是因为项目中有一个需求报表统计一年中各材料的使用数量,举例如下
1月份 苹果/6个、西瓜/3个、李子/2个、桃子/9个、哈密瓜/7个、枣/15个、荔枝/18个、火龙果/32个 ----看起来数据正常是吧
2月份 月饼/1个、银行卡/4张、桃子/10箱、卫生纸/12卷、桃子/5斤、板烧鸡腿堡/1个、猫咪玩偶/2个 ----稀奇古怪的东西加了进来, 桃子 一会个/一会箱
3月份 发夹/6个、?/3个、柚子x哈密瓜/2麻袋、猪肉/2两、牛/7头、纸巾/15箱(20包/箱)、洗衣粉/18支、洗衣液/2瓶 ----你已经完全不知道会有些什么东西了
………………………………大概就是同种东西不同规格,还有可能混在一起但是知道以何种方式混合比如 柚子x哈密瓜/2麻袋 可以看作各一麻袋 一麻袋=20个
总而言之 ,当时为了实现此统计报表使用了多层嵌套for each循环数据, 先For each出所有的excel文件中类型即 苹果,西瓜,发夹,银行卡...然后无条件(无脑)塞到一个数据集(SDT集合)里面去,然后新建立一个报表集(SDT集合),在循环数据集的过程中挨个放到统计集中去,理论上是可行的,但是这样做的缺点是我没法直接操作统计集进行数据的更改,只能循环统计集后找到这个元素才能对他进行操作,举例如下:
数据集 内容
苹果(个) :16
苹果x梨子(麻袋):2
苹果/(箱):3
====================================
开始循环
For 数据集
For 统计集
if 统计集中不存在此元素 //比如不存在苹果/个
add 新统计集元素 并且设置初始数量
else //存在同样的元素 进行数量累加
统计集数量 = 初始数量+数据集新数量 //进行累加
endif
EndFor
End
=================================================
当数据量很大的时候会很费时间,这已经是我极致简化了,中间还有很多查询操作,在数据集和统计集数量相同的情况下,时间复杂度为O(n²),因为当时项目赶需求所以搁置了,后续知道了这个key,value的用法后,改写了此方法,循环一次即可,写法如下所示
=================================================
创建key.value键值对数组 hashmap
For 数据集
if hashmap.get(key) = 数据集新元素 //能找到表示已存在 这里的key可以是”苹果/个“或者 "苹果/箱"
//通过Get方法获取它的value值进行累加
else //没有找到相关元素 属于新元素
//通过Set方式 进行新元素的追加
endif
EndFor
=================================================
改完后确实效率提升了不少,快了很多原先可能要10多秒,改完后只有2-3秒左右。
PS:发现这个居然一直没发布 今天更新了一下 去年4月的草稿拖到现在