181 lines
4.1 KiB
ABAP
181 lines
4.1 KiB
ABAP
report z_powerset.
|
||
|
||
interface set.
|
||
methods:
|
||
add_element
|
||
importing
|
||
element_to_be_added type any
|
||
returning
|
||
value(new_set) type ref to set,
|
||
|
||
remove_element
|
||
importing
|
||
element_to_be_removed type any
|
||
returning
|
||
value(new_set) type ref to set,
|
||
|
||
contains_element
|
||
importing
|
||
element_to_be_found type any
|
||
returning
|
||
value(contains) type abap_bool,
|
||
|
||
get_size
|
||
returning
|
||
value(size) type int4,
|
||
|
||
is_equal
|
||
importing
|
||
set_to_be_compared_with type ref to set
|
||
returning
|
||
value(equal) type abap_bool,
|
||
|
||
get_elements
|
||
exporting
|
||
elements type any table,
|
||
|
||
stringify
|
||
returning
|
||
value(stringified_set) type string.
|
||
endinterface.
|
||
|
||
|
||
class string_set definition.
|
||
public section.
|
||
interfaces:
|
||
set.
|
||
|
||
|
||
methods:
|
||
constructor
|
||
importing
|
||
elements type stringtab optional,
|
||
|
||
build_powerset
|
||
returning
|
||
value(powerset) type ref to string_set.
|
||
|
||
|
||
private section.
|
||
data elements type stringtab.
|
||
endclass.
|
||
|
||
|
||
class string_set implementation.
|
||
method constructor.
|
||
loop at elements into data(element).
|
||
me->set~add_element( element ).
|
||
endloop.
|
||
endmethod.
|
||
|
||
|
||
method set~add_element.
|
||
if not line_exists( me->elements[ table_line = element_to_be_added ] ).
|
||
append element_to_be_added to me->elements.
|
||
endif.
|
||
|
||
new_set = me.
|
||
endmethod.
|
||
|
||
|
||
method set~remove_element.
|
||
if line_exists( me->elements[ table_line = element_to_be_removed ] ).
|
||
delete me->elements where table_line = element_to_be_removed.
|
||
endif.
|
||
|
||
new_set = me.
|
||
endmethod.
|
||
|
||
|
||
method set~contains_element.
|
||
contains = cond abap_bool(
|
||
when line_exists( me->elements[ table_line = element_to_be_found ] )
|
||
then abap_true
|
||
else abap_false ).
|
||
endmethod.
|
||
|
||
|
||
method set~get_size.
|
||
size = lines( me->elements ).
|
||
endmethod.
|
||
|
||
|
||
method set~is_equal.
|
||
if set_to_be_compared_with->get_size( ) ne me->set~get_size( ).
|
||
equal = abap_false.
|
||
|
||
return.
|
||
endif.
|
||
|
||
loop at me->elements into data(element).
|
||
if not set_to_be_compared_with->contains_element( element ).
|
||
equal = abap_false.
|
||
|
||
return.
|
||
endif.
|
||
endloop.
|
||
|
||
equal = abap_true.
|
||
endmethod.
|
||
|
||
|
||
method set~get_elements.
|
||
elements = me->elements.
|
||
endmethod.
|
||
|
||
|
||
method set~stringify.
|
||
stringified_set = cond string(
|
||
when me->elements is initial
|
||
then `∅`
|
||
when me->elements eq value stringtab( ( `∅` ) )
|
||
then `{ ∅ }`
|
||
else reduce string(
|
||
init result = `{ `
|
||
for element in me->elements
|
||
next result = cond string(
|
||
when element eq ``
|
||
then |{ result }∅, |
|
||
when strlen( element ) eq 1 and element ne `∅`
|
||
then |{ result }{ element }, |
|
||
else |{ result }\{{ element }\}, | ) ) ).
|
||
|
||
stringified_set = replace(
|
||
val = stringified_set
|
||
regex = `, $`
|
||
with = ` }`).
|
||
endmethod.
|
||
|
||
|
||
method build_powerset.
|
||
data(powerset_elements) = value stringtab( ( `` ) ).
|
||
|
||
loop at me->elements into data(element).
|
||
do lines( powerset_elements ) times.
|
||
if powerset_elements[ sy-index ] ne `∅`.
|
||
append |{ powerset_elements[ sy-index ] }{ element }| to powerset_elements.
|
||
else.
|
||
append element to powerset_elements.
|
||
endif.
|
||
enddo.
|
||
endloop.
|
||
|
||
powerset = new string_set( powerset_elements ).
|
||
endmethod.
|
||
endclass.
|
||
|
||
|
||
start-of-selection.
|
||
data(set1) = new string_set( ).
|
||
data(set2) = new string_set( ).
|
||
data(set3) = new string_set( ).
|
||
|
||
write: |𝑷( { set1->set~stringify( ) } ) -> { set1->build_powerset( )->set~stringify( ) }|, /.
|
||
|
||
set2->set~add_element( `∅` ).
|
||
write: |𝑷( { set2->set~stringify( ) } ) -> { set2->build_powerset( )->set~stringify( ) }|, /.
|
||
|
||
set3->set~add_element( `1` )->add_element( `2` )->add_element( `3` )->add_element( `3` )->add_element( `4`
|
||
)->add_element( `4` )->add_element( `4` ).
|
||
write: |𝑷( { set3->set~stringify( ) } ) -> { set3->build_powerset( )->set~stringify( ) }|, /.
|