ãµãã¤ã®Iterator
ã³ã¼ããæ¸ãã¦ããã¨ãã¾ã«ãµãã¤ã®Iteratorããã£ããã«åãã³ã¼ããæ¸ãã¯ãã«ãªãã
/** ãµãã¤ã®Itaratorã並ã¹ã¦åããµã³ãã« */ static boolean compare1(List<String> list1, List<Integer> list2) { if (list1.size() != list2.size()) { throw new IllegalArgumentException("åæ°ã®ä¸ä¸è´"); } Iterator<String> ite1 = list1.iterator(); Iterator<Integer> ite2 = list2.iterator(); // æ¢ãã¦ã·ã§ã¼ããµã¼ãããããªã&æ¼ç®ãç¨ãã while (ite1.hasNext() & ite2.hasNext()) { String v1 = ite1.next(); int v2 = ite2.next(); if (Integer.parseInt(v1) != v2) { return false; } } return true; }
åä¸ã®Listãå¦çããå ´åã¯for-eachæ§æã§ã«ã¼ããããã¨ããã ãã©(ããã¯Java7ã®è©±ã ã¨æã£ã¦ããã ããã)ããµãã¤ã®è¦ç´ æ°ã®çããåæã®Listãã«ã¼ãããããã¨ãªãã¨é¢åèããã¨ã«ãªããä¸è¨ã³ã¼ãã¯Iteratorã§è¨è¿°ãããããããªãå¤å ¸çforæã§ã«ã¼ãã«ã¦ã³ã¿iãç¨æãã¦ä»¥ä¸ã®ããã«æ¸ããã»ãããã·ãªããããªããã¨æããã
/** ã«ã¼ãã«ã¦ã³ã¿æ¹å¼ */ static boolean compare2(List<String> list1, List<Integer> list2) { if (list1.size() != list2.size()) { throw new IllegalArgumentException("åæ°ã®ä¸ä¸è´"); } for (int i=0; i<list1.size(); i++) { String v1 = list1.get(i); int v2 = list2.get(i); if (Integer.parseInt(v1) != v2) { return false; } } return true; }
ãªãããã£ããããªããªã¼ãã¨æã£ã¦ããã®ã ãã©ããµãã¤ã®Iteratorãã¾ã¨ãã¦åãIteratorãä½ãã°ãããã¨ã«æ°ä»ããã
ã¾ããJavaã«ã¯ã¿ãã«ããªãã®ã§é©å½ã«ã¯ã©ã¹ãä½ã
public class Tuple<T1, T2> { public T1 t1; public T2 t2; public Tuple() {} public Tuple(T1 t1, T2 t2) { this.t1 = t1; this.t2 = t2; } }
ããã¦ããµãã¤ã®Iteratorãåãåã£ã¦Tupleãè¿ããããªIteratorã®å®è£ ãæ¸ãã
import java.util.Iterator; /** * ãµãã¤ã®Iteratorã並ã¹ã¦ã«ã¼ããããããã®Itaratorã®ãµã³ãã« * * @author nagise * * @param <T1> Itarator1 ã§æ±ãå * @param <T2> Itarator2 ã§æ±ãå */ public class TupleIterator<T1, T2> implements Iterator<Tuple<T1, T2>>, Iterable<Tuple<T1, T2>> { Iterator<? extends T1> ite1; Iterator<? extends T2> ite2; /** * 2ã¤ã®ItaratorããTupleIteratorãä½ã */ public TupleIterator(Iterator<? extends T1> ite1, Iterator<? extends T2> ite2) { this.ite1 = ite1; this.ite2 = ite2; } /** * 2ã¤ã®IterableããTupleIteratorãä½ã */ public TupleIterator(Iterable<? extends T1> ite1, Iterable<? extends T2> ite2) { this.ite1 = ite1.iterator(); this.ite2 = ite2.iterator(); } /** * @throws IllegalStateException ãµãã¤ã®Itaratorã®è¦ç´ æ°ãä¸ä¸è´ã®å ´å */ @Override public boolean hasNext() { boolean n1 = ite1.hasNext(); boolean n2 = ite2.hasNext(); if (n1 ^ n2) { throw new IllegalStateException("åæ°ã®ä¸ä¸è´"); } return n1; } @Override public Tuple<T1, T2> next() { return new Tuple<T1, T2>(ite1.next(), ite2.next()); } @Override public void remove() { ite1.remove(); ite2.remove(); } @Override public Iterator<Tuple<T1, T2>> iterator() { return this; } }
ã¨ãã£ãè¨è¿°ã«ãªããèªä½ã©ã¤ãã©ãªãåãã§ãã¦é¢åèãã¨ããã ããè¨è¨çã«ã¯ç¶ºéºã«ãªãããªãã
ç´°ããå®è£ ã®ãã¤ã³ã
java.lang.Iterable (ãã¦ãã¶ã)㨠java.util.Iterator (ãã¦ãã¼ãã¼)ãæ··å¨ãã¦ãããè¦ãç®ãä¼¼ã¦ããã®ã§æ°ãã¤ãã¦ã¿ãªãã¨æ··åãããããããªãã
java.lang.Iterable ã¯Java5ããã®interfaceã§ãåããJava5ãã追å ã«ãªã£ãfor-eachæ§æã®ããã®interfaceã§ããããã®Iterableãå®è£ ããã¯ã©ã¹ã¯for-eachã«æå ¥ãã¦ã«ã¼ãããããã¨ãã§ããã
ãã®interfaceã®ã¡ã½ããã¯åä¸ã§
å T ã®è¦ç´ ã»ããã®ã¤ãã¬ã¼ã¿ãè¿ãã¾ãã
æ»ãå¤:
Iterable (Java Platform SE 7)
ã¤ãã¬ã¼ã¿ã
ãã®iterator()ã¡ã½ããã§è¿ãããjava.util.Iteratorãç¨ãã¦ã«ã¼ãããã¨ãã寸æ³ã ã
ããã§é¢åèã話ãªã®ã ããjava.util.Iterator(ãã¦ãã¼ãã¼)ã¯Iterable(ãã¦ãã¶ã)ã§ã¯ãªãããã®ãããIterator(ãã¦ãã¼ãã¼)ãªãã¸ã§ã¯ããæã¡åã£ã¦ããæããã®ã¾ã¾ã§ã¯for-eachã®ã«ã¼ãã«ä½¿ããªãã
ãã®ãããIterator(ãã¦ãã¼ãã¼)ã®å®è£ ã¯ã©ã¹ã¯ãã°ãã°Iterable(ãã¦ãã¶ã)ããããã¦implementsãã以ä¸ã®ããã«return this;ã¨ããå®è£ ãè¦ãããã
@Override public Iterator<Tuple<T1, T2>> iterator() { return this; }
å人çã«ã¯ãã¢ããã ããå©ä¾¿æ§ã®ããã«ã¯å¦¥åããã¨ãããªã®ã ãããããããfor-eachãIteratorãã®ãã®ãåããã°ãããªãã¨ã«ã¯ãªããªããã ãã©ã
追è¨
https://gist.github.com/yuba/9612538
iterator()ã§return this;ã¨ããå®è£ ã ã¨è¤æ°åiterator()ãå¼ã¶ã¨ç ´ç¶»ããã¨ã®ææã確ãã«ãå稿ãæ¸ãã¦ããæã« return thisããã¢ãçç±ãã±ã£ã¨èª¬æã§ããªãã£ãã®ã ãã©ã¹ãããªããã
ãã¾ã
Javaã§ã¯^è¨å·ã¯XORæ¼ç®ã表ããæ®æ®µifæã§ä½¿ãæ©ä¼ã¯å°ãªãã ããããç¡çãã¦ä½¿ãå¿ è¦ããªã :-P
追è¨ãã®2
ãããªãã¦zipé¢æ°
é¢æ°åè¨èªã触ã£ã¦ã¦è»è¼ªãåçºæãã¾ããçãªãä¸åå¼·ã§ããã¾ããã