Code: Alles auswählen.
REPORT zknobel_xstring.
PARAMETERS: p_seed TYPE i,
p_expon TYPE numc2 OBLIGATORY DEFAULT 23. " Bis 2^23 = 8.388.608 < 10 Millionen
CLASS lcl_knobel DEFINITION FINAL.
PUBLIC SECTION.
TYPES: mtt_x TYPE STANDARD TABLE OF x WITH NON-UNIQUE DEFAULT KEY.
METHODS:
main,
build_problem IMPORTING iv_times TYPE i
RETURNING VALUE(rt_x) TYPE mtt_x,
build_xstring IMPORTING it_x TYPE mtt_x
RETURNING VALUE(rv_x) TYPE xstring.
DATA: mo_random TYPE REF TO cl_abap_random_int.
ENDCLASS.
CLASS lcl_knobel IMPLEMENTATION.
METHOD build_xstring.
**********************************************************************
* Für diese Methode wird die Laufzeit gemessen.
* Hier soll geschaut werden, ob man irgendwie die Laufzeit verberssern kann
* wenn man anstatt des trivialen Ansatzes einen etwas gewiefteren verwendet.
**********************************************************************
LOOP AT it_x ASSIGNING FIELD-SYMBOL(<lv_x>).
rv_x = rv_x && <lv_x>.
ENDLOOP.
ENDMETHOD.
METHOD build_problem.
DATA: lv_i TYPE byte.
FIELD-SYMBOLS: <lv_x> TYPE x.
DO iv_times TIMES.
lv_i = mo_random->get_next( ).
ASSIGN lv_i TO <lv_x> CASTING.
APPEND <lv_x> TO rt_x.
ENDDO.
ENDMETHOD.
METHOD main.
DATA: lv_count TYPE n,
lv_times TYPE i VALUE 1,
lv_runtime_ms type i,
lv_runtime_ms_last type i value 1,
lv_factor type f.
mo_random = cl_abap_random_int=>create( seed = p_seed
min = 0
max = 255
).
*--------------------------------------------------------------------*
* Max. 2^23 < 10 Millionen Einträge. Später wird's ein Speicherproblem
* aber die Aufgabe soll ein Laufzeitproblem sein
*--------------------------------------------------------------------*
IF p_expon > 23.
p_expon = 23.
ENDIF.
DO p_expon TIMES.
* Setup problem
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
TEXT = |{ sy-index }|.
DATA(lt_x) = me->build_problem( lv_times ).
* Solve and get runtime
GET RUN TIME FIELD DATA(lv_before).
DATA(lv_x) = me->build_xstring( lt_x ).
GET RUN TIME FIELD DATA(lv_after).
lv_runtime_ms = lv_after - lv_before.
lv_factor = lv_runtime_ms / lv_runtime_ms_last.
* Output runtime and some statistics
WRITE:/ lv_times COLOR 1,
AT 16 'Runtime in ms:' COLOR 2, lv_runtime_ms COLOR 2,
at 50 'Factor' color 3, lv_factor EXPONENT 0 DECIMALS 2 color 3.
IF xstrlen( lv_x ) > 30.
WRITE: lv_x(30) COLOR 7 NO-GAP, '...' COLOR 7.
ELSE.
WRITE lv_x COLOR 7.
ENDIF.
lv_runtime_ms_last = lv_runtime_ms.
lv_times = lv_times * 2.
ENDDO.
ENDMETHOD.
ENDCLASS.
END-OF-SELECTION.
NEW lcl_knobel( )->main( ).
Code: Alles auswählen.
LOOP AT it_x INTO DATA(x).
CONCATENATE rv_x x INTO rv_x IN BYTE MODE.
ENDLOOP.
Code: Alles auswählen.
CONCATENATE LINES OF it_x[] INTO rv_x IN BYTE MODE.
Code: Alles auswählen.
METHOD build_xstring.
rv_x = Reduce xstring( INIT lv_str = `` FOR lv_x in it_x NEXT lv_str = |{ lv_str }{ lv_x }| ).
ENDMETHOD.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag (Insgesamt 7):
ewx • Thomas R. • Murdock • a-dead-trousers • ST22 • rob_abc • qyurryus
Code: Alles auswählen.
DATA lv_str type string.
LOOP AT it_x ASSIGNING FIELD-SYMBOL(<lv_x>).
lv_str &&= <lv_x>.
ENDLOOP.
rv_x = lv_str.
Entspricht de facto Variante 3. Aber diese Version war die Version, die ich zunächst verwendet hatte, bevor ich die anderen Lösungen gesehen hatte.