Словари в ABAP - PullRequest
       8

Словари в ABAP

0 голосов
/ 04 декабря 2018

Как перевести этот фрагмент исполняемого псевдокода в abap?

phone_numbers = {
    'hans': '++498912345',
    'peter': '++492169837',
    'alice': '++6720915',
}

# access
print (phone_numbers['hans'])

# add
phone_numbers['bernd']='++3912345'

# update
phone_numbers['bernd']='++123456'

if 'alice' in phone_numbers:
    print('Yes, alice is known')

# all entries
for name, number in phone_numbers.items():
    print(name, number)

Возможен современный ABAP.Я использую sap версию 752.

Меньше символов, больше голосов "за": -)

Кстати, до сих пор никто не добавил abap к pleac (Примеры языков программирования)Как Поваренная книга)

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

@ Ответ Джаггера великолепен, но @guettli попросил более короткий синтаксис.Так что просто для полноты, всегда есть возможность обернуть это в классе:

CLASS dictionary DEFINITION.

  PUBLIC SECTION.

    TYPES:
      BEGIN OF row_type,
        key  TYPE string,
        data TYPE string,
      END OF row_type.

    TYPES hashed_map_type TYPE HASHED TABLE OF row_type WITH UNIQUE KEY key.

    METHODS put
      IMPORTING
        key  TYPE string
        data TYPE string.

    METHODS get
      IMPORTING
        key           TYPE string
      RETURNING
        VALUE(result) TYPE string.

    METHODS get_all
      RETURNING
        VALUE(result) TYPE hashed_map_type.

    METHODS contains
      IMPORTING
        key           TYPE string
      RETURNING
        VALUE(result) TYPE abap_bool.

  PRIVATE SECTION.
    DATA map TYPE hashed_map_type.

ENDCLASS.

CLASS dictionary IMPLEMENTATION.

  METHOD put.
    READ TABLE map REFERENCE INTO DATA(row) WITH TABLE KEY key = key.
    IF sy-subrc = 0.
      row->*-data = data.
    ELSE.
      INSERT VALUE #( key  = key
                      data = data )
        INTO TABLE map.
    ENDIF.
  ENDMETHOD.

  METHOD get.
    result = map[ key = key ]-data.
  ENDMETHOD.

  METHOD get_all.
    INSERT LINES OF map INTO TABLE result.
  ENDMETHOD.

  METHOD contains.
    result = xsdbool( line_exists( map[ key = key ] ) ).
  ENDMETHOD.

ENDCLASS.

Ведущий к:

DATA(phone_numbers) = NEW dictionary( ).

phone_numbers->put( key = 'hans' data = '++498912345' ).
phone_numbers->put( key = 'peter' data = '++492169837' ).
phone_numbers->put( key = 'alice' data = '++6720915' ).

" access
WRITE phone_numbers->get( 'hans' ).

" add
phone_numbers->put( key = 'bernd' data = '++3912345' ).

" update
phone_numbers->put( key = 'bernd' data = '++123456' ).

IF phone_numbers->contains( 'alice' ).
  WRITE 'Yes, alice is known'.
ENDIF.

" all entries
LOOP AT phone_numbers->get_all( ) INTO DATA(row).
  WRITE: / row-key, row-data.
ENDLOOP.

Люди редко делают это в ABAP, потому что внутренние таблицытакой универсальный и мощный.С моей личной точки зрения, я бы хотел, чтобы люди строили больше пользовательских структур данных.Детали реализации, такие как HASHED или SORTED, см. Обсуждение в ответе @ Jagger, при этом естественным образом скрываются.

0 голосов
/ 04 декабря 2018

Ну, а как насчет следующего решения?

REPORT ZZZ.

TYPES: BEGIN OF t_phone_number,
  name TYPE char40,
  number TYPE char40,
  END OF t_phone_number.

DATA: gt_phone_number TYPE HASHED TABLE OF t_phone_number WITH UNIQUE KEY name.

START-OF-SELECTION.
  gt_phone_number = VALUE #(
    ( name = 'hans' number = '++498912345' )
    ( name = 'peter' number = '++492169837' )
    ( name = 'alice' number = '++6720915' )
  ).

* access
  WRITE / gt_phone_number[ name = 'hans' ]-number.

* add
  gt_phone_number = VALUE #( BASE gt_phone_number ( name = 'bernd' number = '++3912345' ) ).

* update
  MODIFY TABLE gt_phone_number FROM VALUE #( name = 'bernd' number = '++123456' ).

  IF line_exists( gt_phone_number[ name = 'alice' ] ).
    WRITE / 'Yes, Alice is known.'.
  ENDIF.

* all entries
  LOOP AT gt_phone_number ASSIGNING FIELD-SYMBOL(<g_phone_number>).
    WRITE: /, <g_phone_number>-name, <g_phone_number>-number.
  ENDLOOP.
...