首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ABAP词典。多么?

ABAP词典。多么?
EN

Stack Overflow用户
提问于 2018-12-04 12:30:00
回答 2查看 637关注 0票数 8

如何将这段可执行伪代码转换为ABAP?

代码语言:javascript
复制
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可以达到752,更少的字符,更高的选票:-)

P.S. BTW,到目前为止还没有人将abap添加到胸膜 (编程语言示例类似于Cookbook)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-04 13:42:32

那么,下面的解决方案如何?

代码语言:javascript
复制
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.
票数 5
EN

Stack Overflow用户

发布于 2018-12-06 08:47:03

@Jagger的回答很好,但是guettli要求语法更短。因此,为了完整起见,当然总是有可能将其包装在一个类中:

代码语言:javascript
复制
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.

导致:

代码语言:javascript
复制
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中,人们很少这样做,因为内部表是如此的通用和强大。从我个人的角度来看,我希望看到人们构建更多的自定义数据结构。实现细节,如散列或排序,参见@Jagger的答案中的讨论,在这样做时会以自然的方式隐藏起来。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53613063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档