--/--/--

スポンサーサイト

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

2007/10/10

python の zip 関数を java でやってみる

あまり日の目を見ない python の組込み関数 zip を java で。zip 関数は値が2つのタプルを返すけど、 java にはタプルがないので、代わりに Pair という2つの値を内包するクラスを作ってみた。

初の Iterable なクラス作成なだけに、これでいいのやらって感じ。

Pair.java

 1 package util;
 2 
 3 public class Pair<T, V> {
 4 
 5    public T first;
 6    public V second;
 7 
 8    public Pair(T first, V second) {
 9        this.first = first;
10        this.second = second;
11    }
12 
13 }

Zip.java

 1 package util;
 2 
 3 import java.util.Iterator;
 4 
 5 public class Zip<T, V> implements Iterable<Pair<T, V>>, Iterator<Pair<T, V>> {
 6 
 7    private Iterator<T> iter1;
 8    private Iterator<V> iter2;
 9 
10    Zip(Iterable<T> iter1, Iterable<V> iter2) {
11        this.iter1 = iter1.iterator();
12        this.iter2 = iter2.iterator();
13    }
14 
15    public static <U, E> Zip<U, E> zip(Iterable<U> iter1, Iterable<E> iter2) {
16        return new Zip<U, E>(iter1, iter2);
17    }
18 
19    public Iterator<Pair<T, V>> iterator() {
20        return this;
21    }
22 
23    public boolean hasNext() {
24        return iter1.hasNext() && iter2.hasNext();
25    }
26 
27    public Pair<T, V> next() {
28        return new Pair<T, V>(iter1.next(), iter2.next());
29    }
30 
31    public void remove() {
32        throw new UnsupportedOperationException();
33    }
34 
35 }

ZipTest.java

 1 package util;
 2 
 3 import java.util.*;
 4 
 5 import static util.Zip.zip;
 6 
 7 public class ZipTest {
 8 
 9    public static void main(String[] args) {
10        List<Integer> list1 = new ArrayList<Integer>();
11        List<Integer> list2 = new ArrayList<Integer>();
12 
13        list1.add(1);
14        list1.add(2);
15        list1.add(3);
16        list1.add(4);
17        list1.add(5);
18 
19        list2.add(6);
20        list2.add(7);
21        list2.add(8);
22 
23        for (Pair<Integer, Integer> p : zip(list1, list2)) {
24            System.out.println("first: " + p.first + ", second: " + p.second);
25        }
26        System.out.println();
27 
28        List<Integer> list3 = new ArrayList<Integer>();
29        List<String> list4  = new ArrayList<String>();
30 
31        list3.add(1);
32        list3.add(2);
33        list3.add(3);
34        list3.add(4);
35 
36        list4.add("hello");
37        list4.add("world");
38 
39        for (Pair<Integer, String> p : zip(list3, list4)) {
40            System.out.println("first: " + p.first + ", second: " + p.second);
41        }
42 
43    }
44 
45 }

実行結果

$ java -cp . util.ZipTest
first: 1, second: 6
first: 2, second: 7
first: 3, second: 8

矢野勉のはてな日記 - [Java][ドリル]日常ドリル・pythonのrange関数をJavaでやってみる: ここを見てやってみようと思ったんだけど、なかなか面白い。Iterable なクラスを書くのも面白いし、python とか他の言語の組込み関数を java で作ってみるというのもまた面白い。暇つぶしにしよう。

スポンサーサイト

comment

post




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