Another update from ingydotnet^djgoku
This commit is contained in:
parent
91df62d461
commit
948b86eafa
7604 changed files with 108452 additions and 22726 deletions
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue