在ABAP中使用二分法查找之前需要注意内表需要提前经过排序,尤其注意根据哪个字段使用BINARY SEARCH,就要针对哪个字段进行排序。使用两个及以上字段更要注意这一点,不可以用A B排序,再用B C去二分法查找,这样通常是读不到所需数据的。
TYPES: BEGIN OF ty_data,
field1 TYPE i,
field2 TYPE string,
END OF ty_data.
DATA: lt_table TYPE TABLE OF ty_data WITH EMPTY KEY,
lv_key1 TYPE i,
lv_key2 TYPE string.
" 准备数据
lt_table = VALUE #( ( field1 = 1 field2 = 'A' )
( field1 = 2 field2 = 'B' )
( field1 = 3 field2 = 'A' )
( field1 = 3 field2 = 'C' ) ).
" 确保数据按联合主键排序
SORT lt_table BY field1 field2.
" 要查找的键值
lv_key1 = 3.
lv_key2 = 'C'.
" 二分查找
READ TABLE lt_table WITH KEY field1 = lv_key1 field2 = lv_key2 BINARY SEARCH TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
WRITE: / |找到记录,索引位置:{ sy-tabix }|.
ELSE.
WRITE: / |未找到匹配记录。|.
ENDIF.
查找失败后的sy-tabix意义
如果READ TABLE未找到记录,sy-tabix返回值表示应插入的位置,保持内表有序性。
使用TRANSPORTING NO FIELDS提高效率
如果只需要确认记录是否存在而不需要读取其值,可以使用TRANSPORTING NO FIELDS。
对于大数据量的查找,若字段种类复杂,使用HASHED TABLE会比二分查找效率更高:
DATA: lt_table TYPE HASHED TABLE OF ty_data WITH UNIQUE KEY field1 field2.
标签:lv,field2,field1,lt,二分法,ABAP,查找,TYPE From: https://blog.csdn.net/m0_64077397/article/details/144063093