如何避免ABAP内表嵌套循环?实现COL_POS字段赋值优化
避免ABAP内表嵌套循环的方案(字段匹配赋值场景)
原代码通过嵌套循环实现字段名匹配并更新COL_POS,时间复杂度为O(n*m),数据量大时性能较差。以下是两种无需嵌套循环的优化方案:
方案一:使用哈希表(推荐,查找效率O(1))
将t_fcat转换为以FIELDNAME为唯一键的哈希表,循环t_fieldcat时直接通过键快速查找匹配项,避免嵌套遍历:
DATA: t_fieldcat TYPE slis_fieldcat_alv, t_fcat TYPE kkblo_t_fieldcat, " 定义哈希表,以FIELDNAME作为唯一键 ht_fcat TYPE HASHED TABLE OF kkblo_fieldcat WITH UNIQUE KEY fieldname. " 将原内表数据导入哈希表 INSERT LINES OF t_fcat INTO TABLE ht_fcat. " 循环更新t_fieldcat的COL_POS字段 LOOP AT t_fieldcat INTO DATA(lx_fieldcat). READ TABLE ht_fcat INTO DATA(lx_fcat) WITH TABLE KEY fieldname = lx_fieldcat-fieldname. IF sy-subrc = 0. lx_fieldcat-col_pos = lx_fcat-col_pos. MODIFY t_fieldcat FROM lx_fieldcat INDEX sy-tabix. " 替换原行,而非追加新行 ENDIF. ENDLOOP.
注:原代码中
APPEND会导致t_fieldcat重复追加数据,此处修正为MODIFY更新原行,符合“赋值给对应行”的需求。若t_fcat存在重复FIELDNAME,需先去重或改用非唯一键的排序表。
方案二:排序后使用二分查找
先对t_fcat按FIELDNAME排序,再通过二分查找匹配字段,时间复杂度优化为O(n log m):
DATA: t_fieldcat TYPE slis_fieldcat_alv, t_fcat TYPE kkblo_t_fieldcat. " 对t_fcat按FIELDNAME升序排序 SORT t_fcat BY fieldname. " 循环更新t_fieldcat的COL_POS字段 LOOP AT t_fieldcat INTO DATA(lx_fieldcat). READ TABLE t_fcat INTO DATA(lx_fcat) WITH KEY fieldname = lx_fieldcat-fieldname BINARY SEARCH. IF sy-subrc = 0. lx_fieldcat-col_pos = lx_fcat-col_pos. MODIFY t_fieldcat FROM lx_fieldcat INDEX sy-tabix. ENDIF. ENDLOOP.
关键注意事项
- 若
t_fcat中存在重复FIELDNAME,哈希表方案会触发插入错误,此时可改用非唯一键的排序表,或提前对t_fcat去重(保留需要的COL_POS值)。 - 两种方案均避免了嵌套循环,大幅提升数据量大时的处理性能。
内容的提问来源于stack exchange,提问作者Bigflatfoot
相关产品推荐
相关产品推荐

