java - Compact a comma delimited number list into ranges -


i'm looking clever way following operation:

take list of numbers:

1, 2, 3, 4, 5, 12, 13, 14, 19

and compact string so:

1-5, 12-14, 19

with following rule: compress range (i.e. use dash) when count of numbers in range 3 or more.

i.e.: 1, 2, 4, 5 result in: 1, 2, 4, 5 , not: 1-2, 4-5

i can think custom collector... can create method return collector , code compact in case, provided collector hidden via static factory method.

notice how combiner doing nothing, not parallel coding. i'm still trying think of way provide implementation it.

 list<string> result = intstream.of(1, 2, 3, 4, 5, 12, 13, 14, 19)             .boxed()             .collect(collector.of(                     () -> {                         list<list<integer>> list = new arraylist<>();                         list.add(new arraylist<>());                         return list;                     },                     (list, x) -> {                         list<integer> inner = list.get(list.size() - 1);                         if (inner.size() == 0) {                             inner.add(x);                         } else {                             int lastelement = inner.get(inner.size() - 1);                             if (lastelement == x - 1) {                                 inner.add(x);                             } else {                                 list<integer> onemore = new arraylist<>();                                 onemore.add(x);                                 list.add(onemore);                             }                         }                     },                     (left, right) -> {                         throw new illegalargumentexception("no parallel!");                     },                      list -> {                          return list.stream()                                 .map(inner -> {                                     if (inner.size() > 1) {                                         return inner.get(0) + "-" + inner.get(inner.size() - 1);                                     }                                     return "" + inner.get(0);                                 }).collect(collectors.tolist());                      }));      system.out.println(result); 

Comments

Popular posts from this blog

python - Selenium remoteWebDriver (& SauceLabs) Firefox moseMoveTo action exception -

html - How to custom Bootstrap grid height? -

transpose - Maple isnt executing function but prints function term -