Python에는 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);
}

자바도 제네레이터가 있으면 좋을텐데…

-- 이상한 나라의 종텐.


« Previous : 1 : ... 46 : 47 : 48 : 49 : 50 : 51 : 52 : 53 : 54 : ... 279 : Next »