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.

效果展示:

posted @ 2024-05-31 10:10  狐嫁  阅读(51)  评论(0编辑  收藏  举报