124 lines
3.9 KiB
ABAP
124 lines
3.9 KiB
ABAP
CLASS {{p}}league_table DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
TYPES ty_team TYPE c LENGTH 10.
|
|
|
|
TYPES:
|
|
BEGIN OF ty_match,
|
|
home_team TYPE ty_team,
|
|
away_team TYPE ty_team,
|
|
home_goals TYPE i,
|
|
away_goals TYPE i,
|
|
END OF ty_match.
|
|
TYPES tt_match TYPE STANDARD TABLE OF ty_match WITH EMPTY KEY.
|
|
|
|
TYPES:
|
|
BEGIN OF ty_row,
|
|
rank TYPE i,
|
|
team TYPE ty_team,
|
|
played TYPE i,
|
|
won TYPE i,
|
|
drawn TYPE i,
|
|
lost TYPE i,
|
|
goals_for TYPE i,
|
|
goals_against TYPE i,
|
|
goal_diff TYPE i,
|
|
points TYPE i,
|
|
END OF ty_row.
|
|
TYPES tt_row TYPE STANDARD TABLE OF ty_row WITH EMPTY KEY.
|
|
|
|
METHODS evaluate
|
|
IMPORTING it_matches TYPE tt_match
|
|
RETURNING VALUE(rt_table) TYPE tt_row.
|
|
|
|
PRIVATE SECTION.
|
|
TYPES tt_work TYPE HASHED TABLE OF ty_row WITH UNIQUE KEY team.
|
|
|
|
METHODS is_invalid
|
|
IMPORTING is_match TYPE ty_match
|
|
RETURNING VALUE(rv_bad) TYPE abap_bool.
|
|
|
|
METHODS add_result
|
|
IMPORTING iv_team TYPE ty_team
|
|
iv_goals_for TYPE i
|
|
iv_goals_against TYPE i
|
|
CHANGING ct_work TYPE tt_work.
|
|
|
|
METHODS assign_rank
|
|
CHANGING ct_table TYPE tt_row.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}league_table IMPLEMENTATION.
|
|
METHOD evaluate.
|
|
DATA lt_work TYPE tt_work.
|
|
|
|
LOOP AT it_matches INTO DATA(ls_match).
|
|
IF is_invalid( ls_match ) = abap_true.
|
|
add_result( EXPORTING iv_team = ls_match-home_team
|
|
iv_goals_for = ls_match-home_goals
|
|
iv_goals_against = ls_match-away_goals
|
|
CHANGING ct_work = lt_work ).
|
|
add_result( EXPORTING iv_team = ls_match-away_team
|
|
iv_goals_for = ls_match-away_goals
|
|
iv_goals_against = ls_match-home_goals
|
|
CHANGING ct_work = lt_work ).
|
|
ENDIF.
|
|
ENDLOOP.
|
|
|
|
rt_table = lt_work.
|
|
SORT rt_table BY points DESCENDING
|
|
goal_diff DESCENDING
|
|
goals_for DESCENDING
|
|
team ASCENDING.
|
|
assign_rank( CHANGING ct_table = rt_table ).
|
|
ENDMETHOD.
|
|
|
|
METHOD is_invalid.
|
|
rv_bad = xsdbool( is_match-home_team IS INITIAL
|
|
OR is_match-away_team IS INITIAL
|
|
OR is_match-home_team = is_match-away_team
|
|
OR is_match-home_goals < 0
|
|
OR is_match-away_goals < 0 ).
|
|
ENDMETHOD.
|
|
|
|
METHOD add_result.
|
|
ASSIGN ct_work[ team = iv_team ] TO FIELD-SYMBOL(<ls_row>).
|
|
IF sy-subrc <> 0.
|
|
INSERT VALUE ty_row( team = iv_team ) INTO TABLE ct_work ASSIGNING <ls_row>.
|
|
ENDIF.
|
|
|
|
<ls_row>-played = <ls_row>-played + 1.
|
|
<ls_row>-goals_for = <ls_row>-goals_for + iv_goals_for.
|
|
<ls_row>-goals_against = <ls_row>-goals_against + iv_goals_against.
|
|
<ls_row>-goal_diff = <ls_row>-goals_for - <ls_row>-goals_against.
|
|
|
|
IF iv_goals_for > iv_goals_against.
|
|
<ls_row>-won = <ls_row>-won + 1.
|
|
<ls_row>-points = <ls_row>-points + 3.
|
|
ELSEIF iv_goals_for = iv_goals_against.
|
|
<ls_row>-drawn = <ls_row>-drawn + 1.
|
|
<ls_row>-points = <ls_row>-points + 1.
|
|
ELSE.
|
|
<ls_row>-lost = <ls_row>-lost + 1.
|
|
ENDIF.
|
|
ENDMETHOD.
|
|
|
|
METHOD assign_rank.
|
|
DATA lv_rank TYPE i.
|
|
DATA lv_position TYPE i.
|
|
DATA ls_previous TYPE ty_row.
|
|
|
|
LOOP AT ct_table ASSIGNING FIELD-SYMBOL(<ls_row>).
|
|
lv_position = lv_position + 1.
|
|
IF lv_position = 1
|
|
OR <ls_row>-points <> ls_previous-points
|
|
OR <ls_row>-goal_diff <> ls_previous-goal_diff
|
|
OR <ls_row>-goals_for <> ls_previous-goals_for.
|
|
lv_rank = lv_position.
|
|
ENDIF.
|
|
<ls_row>-rank = lv_rank.
|
|
ls_previous = <ls_row>.
|
|
ENDLOOP.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|