用单词在字符串中找到最大的元素?

Find biggest element in a String with words?

如何在 ABAP 中将一个字符串拆分为 n 个部分并确定哪个是最大的元素?在我的解决方案中,我需要知道有多少个元素,但我想为任意数量的元素解决它。

我试过下面的代码。我在网上搜索。

DATA: string TYPE string VALUE 'this is a string'.
DATA: part1 TYPE c LENGTH 20.
DATA: part2 TYPE c LENGTH 20.
DATA: part3 TYPE c LENGTH 20.
DATA: part4 TYPE c LENGTH 20.
DATA: del TYPE c VALUE ' '.
DATA: bigger TYPE c LENGTH 20.


split: string AT del INTO part1 part2 part3 part4.

bigger = part1.

IF bigger > part2.
  bigger = part1.
ELSEIF bigger > part3.
  bigger = part2.
ELSE.
  bigger = part4.
ENDIF.
WRITE: bigger.

预期结果:处理字符串中任意数量的元素并确定哪个元素最大。

实际结果:我需要知道有多少个元素

这是一种解决方法:

DATA: string TYPE string VALUE 'this is a string'.
TYPES: BEGIN OF ty_words,
         word   TYPE string,
         length TYPE i,
       END OF ty_words.
DATA: ls_words TYPE ty_words.
DATA: gt_words TYPE STANDARD TABLE OF ty_words.

START-OF-SELECTION.
  WHILE string IS NOT INITIAL.
    SPLIT string AT space INTO ls_words-word string.
    ls_words-length = strlen( ls_words-word ).
    APPEND ls_words TO gt_words.
  ENDWHILE.
  SORT gt_words BY length DESCENDING.
  READ TABLE gt_words
       ASSIGNING FIELD-SYMBOL(<ls_longest_word>)
       INDEX 1.
  IF sy-subrc EQ 0.
    WRITE: 'The longest word is:', <ls_longest_word>-word.
  ENDIF.

请注意,如果有更多相同长度的最长单词,它不包括这种情况,它只会显示其中一个。

如果将字符串拆分为数组,则无需知道拆分部分的数量。然后你遍历数组并检查字符串长度以找到最长的一个。

虽然 József Szikszai 的解决方案有效,但对于您需要的功能而言,它可能过于复杂。这同样有效:(也有同样的限制,它只会输出第一个最长的单词,而不会输出其他相同长度的单词)

DATA string TYPE string VALUE 'this is a string'.
DATA parts TYPE STANDARD TABLE OF string.
DATA biggest TYPE string.
FIELD-SYMBOLS <part> TYPE string.

SPLIT string AT space INTO TABLE parts.

LOOP AT parts ASSIGNING <part>.

  IF STRLEN( <part> ) > STRLEN( biggest ).
    biggest = <part>.
  ENDIF.

ENDLOOP.

WRITE biggest.

编辑:我假设 'biggest' 意味着最长,但如果你真的想要字母表中最后一个单词,那么你可以对数组进行降序排序,然后只输出第一个条目,如下所示:

DATA string TYPE string VALUE 'this is a string'.
DATA parts TYPE STANDARD TABLE OF string.
DATA biggest TYPE string.

SPLIT string AT space INTO TABLE parts.
SORT parts DESCENDING.
READ TABLE parts INDEX 1 INTO biggest.

WRITE biggest.

使用 ABAP 740,您还可以将其缩短为:

SPLIT lv_s AT space INTO TABLE DATA(lt_word).
DATA(lv_longest)    = REDUCE string( INIT longest = `` FOR <word> IN lt_word NEXT longest = COND #( WHEN strlen( <word> ) > strlen( longest ) THEN <word> ELSE longest ) ).
DATA(lv_alphabetic) = REDUCE string( INIT alph = ``    FOR <word> IN lt_word NEXT alph    = COND #( WHEN <word> > alph THEN <word> ELSE alph ) ).

如果“最大”表示“最长”,这里的单词是执行此操作的 Regex 方式:

FIND ALL OCCURRENCES OF REGEX '\w+' IN string RESULTS DATA(words).
SORT words BY length DESCENDING.
WRITE substring( val = string off = words[ 1 ]-offset len = words[ 1 ]-length ).