44
55import java .math .BigDecimal ;
66import java .util .*;
7- import java .util .regex .Matcher ;
8- import java .util .regex .Pattern ;
97import java .util .stream .Collectors ;
108import java .util .stream .IntStream ;
119import java .util .stream .Stream ;
@@ -17,7 +15,6 @@ public class SlotUtil {
1715 private static final String POS_X = "position-x" ;
1816 private static final String POS_Y = "position-y" ;
1917 private static final String POS_SLOT = "slot" ;
20- private static final Pattern RANGE_PATTERN = Pattern .compile ("([0-9]+)-([0-9]+)" );
2118
2219 private SlotUtil () {
2320 // EMPTY
@@ -45,10 +42,7 @@ public static List<Integer> getSlots(Map<String, Object> map) {
4542 slots .add ((y - 1 ) * 9 + x - 1 );
4643 }
4744 if (map .containsKey (POS_SLOT )) {
48- slots .addAll (Arrays
49- .stream (String .valueOf (map .get (POS_SLOT )).split ("," ))
50- .map (String ::trim )
51- .flatMap (SlotUtil ::generateSlots ).collect (Collectors .toList ()));
45+ slots .addAll (generateSlots (String .valueOf (map .get (POS_SLOT ))).collect (Collectors .toList ()));
5246 }
5347 return slots ;
5448 }
@@ -61,20 +55,24 @@ public static List<Integer> getSlots(Map<String, Object> map) {
6155 * @return the stream of slots
6256 */
6357 public static Stream <Integer > generateSlots (String input ) {
64- Matcher matcher = RANGE_PATTERN .matcher (input );
65- if (matcher .matches ()) {
66- int s1 = Integer .parseInt (matcher .group (1 ));
67- int s2 = Integer .parseInt (matcher .group (2 ));
68- if (s1 <= s2 ) {
69- return IntStream .rangeClosed (s1 , s2 ).boxed ();
70- } else {
71- return IntStream .rangeClosed (s2 , s1 ).boxed ().sorted (Collections .reverseOrder ());
72- }
73- }
74-
75- return Validate .getNumber (input )
76- .map (BigDecimal ::intValue )
77- .map (Stream ::of )
78- .orElseGet (Stream ::empty );
58+ return Arrays .stream (input .split ("," ))
59+ .map (String ::trim )
60+ .flatMap (rawSlot -> {
61+ String [] rangeSplit = rawSlot .split ("-" , 2 );
62+ if (rangeSplit .length == 2 ) {
63+ Optional <Integer > start = Validate .getNumber (rangeSplit [0 ]).map (BigDecimal ::intValue );
64+ Optional <Integer > end = Validate .getNumber (rangeSplit [1 ]).map (BigDecimal ::intValue );
65+ if (start .isPresent () && end .isPresent ()) {
66+ return IntStream .rangeClosed (start .get (), end .get ()).boxed ();
67+ } else {
68+ return Stream .empty ();
69+ }
70+ } else {
71+ return Validate .getNumber (input )
72+ .map (BigDecimal ::intValue )
73+ .map (Stream ::of )
74+ .orElseGet (Stream ::empty );
75+ }
76+ });
7977 }
8078}
0 commit comments