Java를 위한 Enumerate 기능
2009/06/30 02:29Python에는 Iterable한 항목을 감싸서 메모리 사용량을 최소로 하면서, 인덱스가 포함된 튜플을 돌려주는, enumerate라는 훌륭한 built-in function이 있다. Java에도 있으면 좋을 것 같아서, 흉내 내봤다.
// coded by jong10
// Enumerator class, version:20090630
import java.util.Collection;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Enumerator<T> implements Iterable<Enumerator.Entry<T>> {
public static class Entry<T> {
private T value;
private int index;
Entry(int index, T value) {
this.index = index;
this.value = value;
}
public int getIndex() {
return index;
}
public T getValue() {
return value;
}
}
private static class EnumeratorIterator<T> implements Iterator<Enumerator.Entry<T>> {
private int lastIndex = 0;
private Iterator<T> iterator;
public EnumeratorIterator(Iterator<T> iter) {
this.iterator = iter;
}
public boolean hasNext() {
return iterator.hasNext();
}
public Enumerator.Entry<T> next() {
if (hasNext() == false)
throw new NoSuchElementException();
return new Enumerator.Entry<T>(lastIndex++, iterator.next());
}
public void remove() {
iterator.remove();
}
}
private EnumeratorIterator<T> iterator;
public Enumerator(Collection<T> c) {
this.iterator = new EnumeratorIterator<T>(c.iterator());
}
@Override
public Iterator<Enumerator.Entry<T>> iterator() {
return iterator;
}
}
사용 방법을 보여주는 JUnit 테스트케이스이다.
@Test
public void testEnumerator() {
List<Character> list = Arrays.asList(new Character[] {'h', 'e', 'l', 'l', 'o'});
int[] indexes = new int[list.size()];
char[] values = new char[list.size()];
for (Entry<Character> entry : new Enumerator<Character>(list)) {
indexes[entry.getIndex()] = entry.getIndex();
values[entry.getIndex()] = entry.getValue();
}
assertArrayEquals(new int[] {0, 1, 2, 3, 4}, indexes);
assertArrayEquals(new char[] {'h', 'e', 'l', 'l', 'o'}, values);
}
자바도 제네레이터가 있으면 좋을텐데…
-- 이상한 나라의 종텐.


