Power set: Difference between revisions

no edit summary
No edit summary
No edit summary
Line 39:
report z_powerset.
 
class set definition.
write `P({}) ->`.
public section.
perform calculate_powerset using ``.
methods:
new-line.
constructor
importing
i_elements type stringtab optional,
 
add_element
write `P({ {} }) ->`.
importing
perform calculate_powerset using `{}`.
i_element type string
new-line.
returning
value(r_set) type stringtab,
 
contains_element
write `P({ 1 2 3 4 }) ->`.
importing
perform calculate_powerset using `1234`.
i_element type string
new-line.
returning
value(r_contains) type abap_bool,
 
get_size
form calculate_powerset using set type string.
returning
data(powerset) = value stringtab( ( `` ) ).
value(r_size) type int4,
 
is_equal
data(index) = 0.
importing
i_set type ref to set
returning
value(r_is_equal) type abap_bool,
 
if set = `{}`. get_elements
append `{}` to powerset. returning
value(r_elements) type stringtab,
 
stringify
else.
do strlen( set ) times.returning
data(element) = set+index value(1r_string) type string.
 
do lines( powerset ) times.
append powerset[ sy-index ] && element to powerset.
enddo.
 
private section.
index = index + 1.
data elements type stringtab.
enddo.
endclass.
endif.
 
 
write `{`.
class set implementation.
loop at powerset assigning field-symbol(<subset>).
method constructor.
write `{` && <subset> && `}`.
loop at i_elements assigning field-symbol(<element>).
if not line_exists( elements[ table_line = <element> ] ).
append <element> to elements.
endif.
endloop.
endmethod.
 
 
method add_element.
if not line_exists( elements[ table_line = i_element ] ).
append i_element to elements.
endif.
endmethod.
 
 
method contains_element.
if line_exists( elements[ table_line = i_element ] ).
r_contains = abap_true.
endif.
endmethod.
 
 
method get_size.
r_size = lines( elements ).
endmethod.
 
 
method is_equal.
r_is_equal = abap_true.
 
loop at elements assigning field-symbol(<element>).
if not i_set->contains_element( <element> ).
r_is_equal = abap_false.
return.
endif.
endloop.
 
if not i_set->get_size( ) = me->get_size( ).
r_is_equal = abap_false.
endif.
endmethod.
 
 
method get_elements.
r_elements = elements.
endmethod.
 
 
method stringify.
r_string = cond string(
when elements is initial
then `∅`
 
when elements = value stringtab( ( `∅` ) )
then `{ ∅ }`
 
else reduce string(
init result = `{ `
index = 1
for element in elements
next result = cond string(
when index = lines( elements )
then cond string(
when element = ``
then result && `∅` && ` }`
 
when strlen( element ) = 1 and element <> `∅`
then result && element && ` }`
 
else result && `{` && element && `} }` )
 
else cond string(
when element = ``
then result && `∅` && `, `
 
when strlen( element ) = 1 and element <> `∅`
then result && element && `, `
 
else result && `{` && element && `}, ` ) )
 
index = index + 1 ) ).
endmethod.
endclass.
 
 
start-of-selection.
data(result_set) = new set( ).
data(set1) = new set( ).
data(set2) = new set( value stringtab( ( `∅` ) ) ).
data(set3) = new set( value stringtab( ( `1` ) ( `2` ) ( `3` ) ( `3` ) ( `4` ) ( `4` ) ( `4` ) ) ).
 
write `𝑷( ` && set1->stringify( ) && ` ) ->`.
perform calculate_powerset using set1
changing result_set.
 
write result_set->stringify( ).
new-line.
 
write `𝑷( ` && set2->stringify( ) && ` ) ->`.
perform calculate_powerset using set2
changing result_set.
 
write result_set->stringify( ).
new-line.
 
write `𝑷( ` && set3->stringify( ) && ` ) ->`.
perform calculate_powerset using set3
changing result_set.
 
write result_set->stringify( ).
new-line.
 
 
form calculate_powerset using set type ref to set
changing powerset type ref to set.
 
data(powerset_elements) = cond stringtab(
when set->contains_element( `∅` )
then value stringtab( ( `` ) ( `∅` ) )
else value stringtab( ( `` ) ) ).
 
loop at set->get_elements( ) assigning field-symbol(<element>).
do lines( powerset_elements ) times.
if powerset_elements[ sy-index ] <> `∅`.
append powerset_elements[ sy-index ] && <element> to powerset_elements.
else.
append <element> to powerset_elements.
endif.
enddo.
endloop.
 
write `}`.
powerset = new set( powerset_elements ).
endform.
</lang>
Line 82 ⟶ 222:
 
<pre>
P𝑷({}) -> { {} }
P𝑷( { {} }) -> { {}∅, {{}} }
P𝑷( { 1, 2, 3, 4 } ) -> { {}∅, {1}, {2}, {12}, {3}, {13}, {23}, {123}, {4}, {14}, {24}, {124}, {34}, {134}, {234}, {1234} }
</pre>
 
Anonymous user