Skip to content

Instantly share code, notes, and snippets.

@yuba
Created March 18, 2014 02:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yuba/9612538 to your computer and use it in GitHub Desktop.
Save yuba/9612538 to your computer and use it in GitHub Desktop.
http://d.hatena.ne.jp/Nagise/20140315/1394884271 の、Iterator, Iterableを一個のクラスにまとめて実装してしまうのは .iterator() を複数回呼び出したときに問題があるので匿名クラスを使った実装を書いてみました。
public static <T1,T2> Iterable<Tuple<T1,T2>> zip (
final Iterable<? extends T1> src1,
final Iterable<? extends T2> src2) {
return new Iterable<Tuple<T1, T2>>() {
@Override
public Iterator<Tuple<T1, T2>> iterator() {
final Iterator<? extends T1> iterator1 = src1.iterator();
final Iterator<? extends T2> iterator2 = src2.iterator();
return new Iterator<Tuple<T1, T2>>() {
@Override
public boolean hasNext() {
boolean n1 = iterator1.hasNext();
boolean n2 = iterator2.hasNext();
if (n1 != n2) {
throw new IllegalStateException("個数の不一致");
}
return n1;
}
@Override
public Tuple<T1, T2> next() {
return new Tuple<T1, T2>(iterator1.next(), iterator2.next());
}
@Override
public void remove() {
iterator1.remove();
iterator2.remove();
}
};
}
};
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment