Created
May 13, 2011 11:11
-
-
Save j5ik2o/970362 to your computer and use it in GitHub Desktop.
JavaでRangeオブジェクト的ななにか
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package util; | |
import java.io.Serializable; | |
import java.util.Iterator; | |
public class Range implements Iterable<Integer>, Serializable, Cloneable { | |
private static class RangeIterator implements Iterator<Integer> { | |
final int start; | |
final int end; | |
final int interval; | |
int current; | |
RangeIterator(int start, int end, int interval) { | |
this.start = start; | |
this.end = end; | |
this.interval = interval; | |
current = start; | |
} | |
@Override | |
public boolean hasNext() { | |
return current <= end; | |
} | |
@Override | |
public Integer next() { | |
final int ret = current; | |
current += interval; | |
return Integer.valueOf(ret); | |
} | |
@Override | |
public void remove() { | |
throw new UnsupportedOperationException("Not supported yet."); | |
} | |
} | |
public static Range range(final int end) { | |
return new Range(0, end, 1); | |
} | |
public static Range range(final int start, final int end) { | |
return new Range(start, end, 1); | |
} | |
public static Range range(final int start, final int end, final int interval) { | |
return new Range(start, end, interval); | |
} | |
private final int start; | |
private final int end; | |
private int interval; | |
Range(final int start, final int end, final int interval) { | |
this.start = start; | |
this.end = end; | |
this.interval = interval; | |
} | |
@Override | |
protected Object clone() throws CloneNotSupportedException { | |
return super.clone(); | |
} | |
@Override | |
public Iterator<Integer> iterator() { | |
return new RangeIterator(start, end, interval); | |
} | |
public Range withInterval(final int interval) { | |
try { | |
Range clone = (Range) clone(); | |
clone.interval = interval; | |
return clone; | |
} catch (CloneNotSupportedException ex) { | |
throw new RuntimeException(ex); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment