RosettaCodeData/Task/Range-expansion/Java/range-expansion.java

66 lines
1.7 KiB
Java

import java.util.*;
class RangeExpander implements Iterator<Integer>, Iterable<Integer> {
private static final Pattern TOKEN_PATTERN = Pattern.compile("([+-]?\\d+)-([+-]?\\d+)");
private final Iterator<String> tokensIterator;
private boolean inRange;
private int upperRangeEndpoint;
private int nextRangeValue;
public RangeExpander(String range) {
String[] tokens = range.split("\\s*,\\s*");
this.tokensIterator = Arrays.asList(tokens).iterator();
}
@Override
public boolean hasNext() {
return hasNextRangeValue() || this.tokensIterator.hasNext();
}
private boolean hasNextRangeValue() {
return this.inRange && this.nextRangeValue <= this.upperRangeEndpoint;
}
@Override
public Integer next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
if (hasNextRangeValue()) {
return this.nextRangeValue++;
}
String token = this.tokensIterator.next();
Matcher matcher = TOKEN_PATTERN.matcher(token);
if (matcher.find()) {
this.inRange = true;
this.upperRangeEndpoint = Integer.valueOf(matcher.group(2));
this.nextRangeValue = Integer.valueOf(matcher.group(1));
return this.nextRangeValue++;
}
this.inRange = false;
return Integer.valueOf(token);
}
@Override
public Iterator<Integer> iterator() {
return this;
}
}
class RangeExpanderTest {
public static void main(String[] args) {
RangeExpander re = new RangeExpander("-6,-3--1,3-5,7-11,14,15,17-20");
for (int i : re) {
System.out.print(i + " ");
}
}
}