Лучший вариант многократного использования - реализовать интерфейс Iterable и переопределить метод iterator ().
Вот пример класса, похожего на ArrayList, реализующего интерфейс, в котором вы переопределяете метод Iterator ().
import java.util.Iterator;
public class SOList<Type> implements Iterable<Type> {
private Type[] arrayList;
private int currentSize;
public SOList(Type[] newArray) {
this.arrayList = newArray;
this.currentSize = arrayList.length;
}
@Override
public Iterator<Type> iterator() {
Iterator<Type> it = new Iterator<Type>() {
private int currentIndex = 0;
@Override
public boolean hasNext() {
return currentIndex < currentSize && arrayList[currentIndex] != null;
}
@Override
public Type next() {
return arrayList[currentIndex++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
return it;
}
}
Этот класс реализует интерфейс Iterable с использованием Generics . Учитывая, что у вас есть элементы в массиве, вы сможете получить экземпляр Iterator, который является необходимым экземпляром, используемым, например, циклом «foreach».
Вы можете просто создать анонимный экземпляр итератора, не создавая расширяющий итератор, и воспользоваться значением currentSize, чтобы проверить, где вы можете перемещаться по массиву (скажем, вы создали массив с емкостью 10, но вы есть только 2 элемента в 0 и 1). Экземпляр будет иметь свой счетчик владельцев, где он находится, и все, что вам нужно сделать, это поиграть с hasNext (), который проверяет, не является ли текущее значение не нулевым, и next (), который вернет экземпляр вашего currentIndex. Ниже приведен пример использования этого API ...
public static void main(String[] args) {
// create an array of type Integer
Integer[] numbers = new Integer[]{1, 2, 3, 4, 5};
// create your list and hold the values.
SOList<Integer> stackOverflowList = new SOList<Integer>(numbers);
// Since our class SOList is an instance of Iterable, then we can use it on a foreach loop
for(Integer num : stackOverflowList) {
System.out.print(num);
}
// creating an array of Strings
String[] languages = new String[]{"C", "C++", "Java", "Python", "Scala"};
// create your list and hold the values using the same list implementation.
SOList<String> languagesList = new SOList<String>(languages);
System.out.println("");
// Since our class SOList is an instance of Iterable, then we can use it on a foreach loop
for(String lang : languagesList) {
System.out.println(lang);
}
}
// will print "12345
//C
//C++
//Java
//Python
//Scala
Если вы хотите, вы можете итерировать по нему, используя экземпляр Iterator:
// navigating the iterator
while (allNumbers.hasNext()) {
Integer value = allNumbers.next();
if (allNumbers.hasNext()) {
System.out.print(value + ", ");
} else {
System.out.print(value);
}
}
// will print 1, 2, 3, 4, 5
Документация foreach находится по адресу http://download.oracle.com/javase/1,5.0/docs/guide/language/foreach.html. Более детальную реализацию вы можете найти в моей личной практике google code .
Теперь, чтобы получить эффект от того, что вам нужно, я думаю, вам нужно подключить концепцию фильтра в Итераторе ... Поскольку итератор зависит от следующих значений, было бы трудно вернуть true в hasNext () и затем отфильтруйте реализацию next () по значению, которое не начинается, например, с символа "a". Я думаю, что вам нужно поиграть со вторым Интератором на основе отфильтрованного списка со значениями с данным фильтром.