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
Post a Comment