Another update from ingydotnet^djgoku

This commit is contained in:
Ingy döt Net 2015-11-18 06:14:39 +00:00
parent 91df62d461
commit 948b86eafa
7604 changed files with 108452 additions and 22726 deletions

View file

@ -1,66 +1,65 @@
import java.util.*;
import java.util.regex.*;
class Range implements Enumeration {
private int clower, cupper;
private int value;
private boolean inrange;
private Scanner ps = null;
private String ss;
class RangeExpander implements Iterator<Integer>, Iterable<Integer> {
private static String del = "\\s*,\\s*";
private static final Pattern TOKEN_PATTERN = Pattern.compile("([+-]?\\d+)-([+-]?\\d+)");
public Range(String s) {
ss = s;
reset();
}
private final Iterator<String> tokensIterator;
public boolean hasMoreElements() {
return (inrange && (value >= clower && value <= cupper)) || ps.hasNext();
}
private boolean inRange;
private int upperRangeEndpoint;
private int nextRangeValue;
public Object nextElement() throws NoSuchElementException {
if (!hasMoreElements())
throw new NoSuchElementException();
if (inrange && (value >= clower && value <= cupper)) {
value++;
return value-1;
public RangeExpander(String range) {
String[] tokens = range.split("\\s*,\\s*");
this.tokensIterator = Arrays.asList(tokens).iterator();
}
inrange = false;
String n = ps.next();
if (n.matches("[+-]?\\d+-[+-]?\\d+")) {
Scanner ls = new Scanner(n);
ls.findInLine("([+-]?\\d+)-([+-]?\\d+)");
MatchResult r = ls.match();
clower = Integer.parseInt(r.group(1));
cupper = Integer.parseInt(r.group(2));
value = clower+1;
inrange = true;
ls.close();
return clower;
@Override
public boolean hasNext() {
return hasNextRangeValue() || this.tokensIterator.hasNext();
}
return Integer.parseInt(n);
}
public void reset() {
if (ps != null)
ps.close();
ps = new Scanner(ss).useDelimiter(del);
inrange = false;
}
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;
}
protected void finalize() throws Throwable {
ps.close();
super.finalize();
}
}
class rangexp {
public static void main(String[] args) {
Range r = new Range("-6,-3--1,3-5,7-11,14,15,17-20");
while (r.hasMoreElements()) {
System.out.print(r.nextElement() + " ");
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 + " ");
}
}
System.out.println();
}
}