SAP ABAP 字符串去除重复字符的两种方法
ABAP里如何去除字符串内的重复字符,在这提供两种方法。
第一种是直接对字符串多次循环进行排除,但考虑到性能问题要尽量减少循环次数。
第二种是把字符串里字符转成内表一列,去重后拼回一个字符串。
方法一示例代码:
点击查看代码
DATA mark TYPE c. "结束标志
DATA num1 TYPE i VALUE 0 . "确认要删除的数量
DATA num2 TYPE i VALUE 0 . "确认要保留的数量
DATA num3 TYPE i . "字符的最大位置
DATA num4 TYPE i VALUE 1 . "检查的位置
DATA num5 TYPE i. "DO循环次数/确认保留字符交换的位置
DATA string1 TYPE c. "中间字符
DATA text(32) TYPE c VALUE 'ABACDBADA'.
*确认长度
num3 = cl_abap_list_utilities=>dynamic_output_length( text ) - 1.
WHILE mark <> 'X'.
*为需要比较的字符赋值
string1 = text+num1(1).
*num5是一个与确认DO循环次数共用的变量,这里是把确认要保留的字符与最后一位非需保留字符做位置交换
num5 = num3 - num2.
text+num1(1) = text+num5(1).
text+num5(1) = string1.
*保留的数量+1
num2 += 1.
*DO循环里,开始检查的起点。从最后一位已确认删除的字符后一位开始
num4 = num1.
*DO循环的次数为字符串总个数-已确认需要保留的个数-已确认需要删除的个数,这样可以确保循环到已确认保留的字符前一位即停止
num5 = num3 + 1 - num2 - num1.
DO num5 TIMES.
"检查到相同的字符,即与第一位非需删除字符做位置交换
IF text+num4(1) = string1.
text+num4(1) = text+num1(1).
text+num1(1) = string1.
"检查到相同即确认删除数量+1
num1 += 1.
ENDIF.
"检查位置向右一位
num4 += 1.
ENDDO.
*结束的标志是需要删除数量+保留数量=总数量
IF num1 + num2 = num3 + 1.
mark = 'X'.
*截断只能用LEFT,不能用RIGHT。原因请自己尝试!
SHIFT text BY num1 PLACES LEFT.
ENDIF.
ENDWHILE.
WRITE / text.
效果展示:
方法二示例代码:
点击查看代码
DATA txt TYPE string.
DATA num6(5) TYPE c VALUE 0.
DATA lt_text TYPE TABLE OF string .
DATA text1 TYPE string VALUE 'ABACDBADA'.
*把字符拆成一列
DO cl_abap_list_utilities=>dynamic_output_length( text1 ) TIMES.
APPEND text1+num6(1) TO lt_text.
num6 += 1.
ENDDO.
*排序去重
SORT lt_text.
DELETE ADJACENT DUPLICATES FROM lt_text COMPARING ALL FIELDS.
*拼回去
LOOP AT lt_text INTO DATA(ls_text).
txt = |{ txt }{ ls_text }|.
ENDLOOP.
WRITE / txt.
效果展示: