Power set: Difference between revisions

no edit summary
No edit summary
No edit summary
Line 39:
report z_powerset.
 
INTERFACEinterface set.
METHODSmethods:
add_element
IMPORTINGimporting
i_element TYPEtype any
RETURNINGreturning
VALUEvalue(r_set) TYPEtype REFref TOto set,
 
remove_element
IMPORTINGimporting
i_element TYPEtype any
RETURNINGreturning
VALUEvalue(r_set) TYPEtype REFref TOto set,
 
contains_element
IMPORTINGimporting
i_element TYPEtype any
RETURNINGreturning
VALUEvalue(r_contains) TYPEtype abap_bool,
 
get_size
RETURNINGreturning
VALUEvalue(r_size) TYPEtype int4,
 
is_equal
IMPORTINGimporting
i_set TYPEtype REFref TOto set
RETURNINGreturning
VALUEvalue(r_is_equal) TYPEtype abap_bool,
 
get_elements
EXPORTINGexporting
e_elements TYPEtype ANYany TABLEtable,
 
stringify
RETURNINGreturning
VALUEvalue(r_string) TYPEtype string.
endinterface.
ENDINTERFACE.
 
 
CLASSclass string_set DEFINITIONdefinition.
PUBLICpublic SECTIONsection.
INTERFACESinterfaces:
set.
 
 
METHODSmethods:
constructor
IMPORTINGimporting
i_elements TYPEtype stringtab OPTIONALoptional,
 
build_powerset
RETURNINGreturning
VALUEvalue(r_powerset) TYPEtype REFref TOto string_set.
 
 
PRIVATEprivate SECTIONsection.
DATAdata elements TYPEtype stringtab.
endclass.
ENDCLASS.
 
 
CLASSclass string_set IMPLEMENTATIONimplementation.
METHODmethod constructor.
LOOPloop ATat i_elements INTOinto DATAdata(element).
me->set~add_element( element ).
ENDLOOPendloop.
ENDMETHODendmethod.
 
 
METHODmethod set~add_element.
IFif NOTnot line_exists( me->elements[ table_line = i_element ] ).
APPENDappend i_element TOto me->elements.
ENDIFendif.
 
r_set = me.
ENDMETHODendmethod.
 
 
METHODmethod set~remove_element.
IFif line_exists( me->elements[ table_line = i_element ] ).
DELETEdelete me->elements WHEREwhere table_line = i_element.
ENDIFendif.
 
r_set = me.
ENDMETHODendmethod.
 
 
METHODmethod set~contains_element.
r_contains = CONDcond abap_bool(
WHENwhen line_exists( me->elements[ table_line = i_element ] )
THENthen abap_true
ELSEelse abap_false ).
ENDMETHODendmethod.
 
 
METHODmethod set~get_size.
r_size = lines( me->elements ).
ENDMETHODendmethod.
 
 
METHODmethod set~is_equal.
IFif i_set->get_size( ) NEne me->set~get_size( ).
r_is_equal = abap_false.
RETURNreturn.
ENDIFendif.
 
LOOPloop ATat me->elements INTOinto DATAdata(element).
IFif NOTnot i_set->contains_element( element ).
r_is_equal = abap_false.
RETURNreturn.
ENDIFendif.
ENDLOOPendloop.
 
r_is_equal = abap_true.
ENDMETHODendmethod.
 
 
METHODmethod set~get_elements.
e_elements = me->elements.
ENDMETHODendmethod.
 
 
METHODmethod set~stringify.
r_string = CONDcond string(
WHENwhen me->elements ISis INITIALinitial
THENthen `∅`
WHENwhen me->elements EQeq VALUEvalue stringtab( ( `∅` ) )
THENthen `{ ∅ }`
ELSEelse REDUCEreduce string(
INITinit result = `{ `
FORfor element INin me->elements
NEXTnext result = CONDcond string(
WHENwhen element EQeq ``
THENthen |{ result }∅, |
WHENwhen strlen( element ) EQeq 1 ANDand element NEne `∅`
THENthen |{ result }{ element }, |
ELSEelse |{ result }\{{ element }\}, | ) ) ).
 
r_string = replace(
Line 181:
regex = `, $`
with = ` }`).
ENDMETHODendmethod.
 
 
METHODmethod build_powerset.
DATAdata(powerset_elements) = VALUEvalue stringtab( ( `` ) ).
 
LOOPloop ATat me->elements INTOinto DATAdata(element).
DOdo lines( powerset_elements ) TIMEStimes.
IFif powerset_elements[ sy-index ] NEne `∅`.
APPENDappend |{ powerset_elements[ sy-index ] }{ element }| TOto powerset_elements.
ELSEelse.
APPENDappend element TOto powerset_elements.
ENDIFendif.
ENDDOenddo.
ENDLOOPendloop.
 
r_powerset = NEWnew string_set( powerset_elements ).
ENDMETHODendmethod.
endclass.
ENDCLASS.
 
 
start-of-selection.
START-OF-SELECTION.
DATAdata(set1) = NEWnew string_set( ).
DATAdata(set2) = NEWnew string_set( ).
DATAdata(set3) = NEWnew string_set( ).
 
WRITEwrite: |𝑷( { set1->set~stringify( ) } ) -> { set1->build_powerset( )->set~stringify( ) }|, /.
 
set2->set~add_element( `∅` ).
WRITEwrite: |𝑷( { 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` ).
WRITEwrite: |𝑷( { set3->set~stringify( ) } ) -> { set3->build_powerset( )->set~stringify( ) }|, /.
</lang>
 
Anonymous user