--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2007/10/12

enumerate

今日は enumerate 関数。名前かぶるからネーミングに困ったけど、クラスとしては Iterator 野郎なだけなので、とりあえず r を付けてごまかした。Pair は zip 関数の時のものと同じで、2つの値を内包するクラス。全体的にほとんど zip と似たような感じで、ただ Pair.first がインデックスになっただけって感じ。

まず python の enumerate 関数のサンプル。

python の enumerate 関数サンプル

>>> a = ['foo', 'bar', 'baz']
>>> for i, v in enumerate(a):
...     print i, v
... 
0 foo
1 bar
2 baz

次に java による enumerate 関数。

Util.java (途中とばし)

 1 package util;
 2 
 3 import java.util.List;
 4 import java.util.ArrayList;
 5 
 6 public class Util {
 7 
28     public static <T> Enumerater<T> enumerate(Iterable<T> target) {
29         return new Enumerater<T>(target);
30     }
31 
32 }

Enumerater.java

 1 package util;
 2 
 3 import java.util.Iterator;
 4 
 5 public class Enumerater<T> implements Iterable<Pair<Integer, T>>, Iterator<Pair<Integer, T>> {
 6 
 7     private int index;
 8 
 9     private Iterator<T> iter;
10 
11     Enumerater(Iterable<T> iter) {
12         this.iter = iter.iterator();
13         this.index = 0;
14     }
15 
16     public Iterator<Pair<Integer, T>> iterator() {
17         return this;
18     }
19 
20     public boolean hasNext() {
21         return iter.hasNext();
22     }
23 
24     public Pair<Integer, T> next() {
25         return new Pair<Integer, T>(index++, iter.next());
26     }
27 
28     public void remove() {
29         throw new UnsupportedOperationException();
30     }
31 
32 }

使用例

73     public void testEnumerater() {
74         List<String> target = new ArrayList<String>();
75         target.add("foo");
76         target.add("bar");
77         target.add("baz");
78 
79         for (Pair<Integer, String> pair : enumerate(target)) {
80             System.out.println("Index[" + pair.first + "]"
81                         + ", Value[" + pair.second + "]");
82         }
83     }

実行結果

Index[0], Value[foo]
Index[1], Value[bar]
Index[2], Value[baz]

拡張 for 文でインデックスを使いたい時に重宝する。予定。

スポンサーサイト
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。