在不使用 sort 语句的情况下在 itab 中找到最大值?

sri*_*nth 1 sorting abap max

有没有办法在snocount不使用SORT语句的情况下找到最大值?

TYPES: BEGIN OF ls_student1,
          snocount(5)  TYPE n,
          id           TYPE i,
          property(10) TYPE c,
          value(10)    TYPE c,
       END OF ls_student1.

DATA: wa1       TYPE ls_student1,
      lt_table4 TYPE HASHED TABLE OF ls_student1 with UNIQUE key snocount id.

lt_table4 = VALUE #(
        ( snocount = 1 id = 1 property = 'name'     value = 'rambo' )
        ( snocount = 4 id = 1 property = 'age'      value = '23' )
        ( snocount = 5 id = 1 property = 'college'  value = 'VIL' )
        ( snocount = 3 id = 1 property = 'phone no' value = '9599993451' )
        ( snocount = 8 id = 1 property = 'f name'   value = 'john whick' ) ).

LOOP AT lt_table4 INTO wa1.
  WRITE:/ wa1-snocount, wa1-id, wa1-property, wa1-value.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

Flo*_*ian 8

程序:

DATA row_with_max_snocount TYPE ls_student1.
LOOP AT lt_table4 INTO DATA(candidate).
  IF candidate-snocount > row_with_max_snocount-snocount.
    row_with_max_snocount = candidate.
  ENDIF.
ENDLOOP.
Run Code Online (Sandbox Code Playgroud)

函数表达式:

DATA(row_with_max_snocoun) =
  REDUCE ls_student1(
    INIT max = VALUE #( )
    FOR row IN lt_table4
    NEXT max = COND #(
      WHEN row-snocount > max-snocount
      THEN row
      ELSE max ) ).
Run Code Online (Sandbox Code Playgroud)

两者都需要c * n步才能找到最大值。如果您这样做一次,并且仅针对最大值,则这在计算理论方面是最佳的。

对表格进行排序以找到最大值通常需要更长的时间,c * n * log n步。这仅在您想按顺序访问多行时才值得。

如果您还需要最小值,则有一种不同的算法可以在3/2 * c * n步骤中完成。

对于包含大量列或包含嵌套结构的表,请考虑使用引用TYPE REF TO ls_student1而不是变量,TYPE ls_student1因为它们可以避免在主内存中复制数据。

  • 真的。我在这里指的是“函数式”,因为它在 ABAP 文档中使用:不是函数式编程的同义词,而是“函数式表达式”中的同义词。 (2认同)