скажем, у меня есть этот простой класс MyArray с двумя простыми методами: add, delete и итератор. В основном методе мы можем видеть, как он должен использоваться:
public class MyArray {
int start;
int end;
int[] arr;
myIterator it;
public MyArray(){
this.start=0;
this.end=0;
this.arr=new int[500];
it=new myIterator();
}
public void add(int el){
this.arr[this.end]=el;
this.end++;
}
public void delete(){
this.arr[this.start]=0;
this.start++;
}
public static void main(String[] args){
MyArray m=new MyArray();
m.add(3);
m.add(299);
m.add(19);
m.add(27);
while(m.it.hasNext()){
System.out.println(m.it.next());
}
}
И тогда MyIterator должен быть реализован как-то:
import java.util.Iterator;
public class myIterator implements Iterator{
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return false;
}
@Override
public Object next() {
// TODO Auto-generated method stub
return null;
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
}
MyIterator должен перебирать arr из MyArray class, от start до end values; оба являются также атрибутами MyArray . Итак, как MyIterator должен использовать атрибуты MyArray , как должен реализовываться MyIterator? Возможно, я могу отправить текущий объект в инициализации:
it=new myIterator(this);
Но я думаю, это не лучшая душа. Или, может быть, сам MyArray должен реализовывать интерфейс Iterator? Как это решается?
EDIT:
Хорошо, спасибо всем. Это был простой пример того, что я хотел сделать, так что мне не нужен массив фиксированной длины. Что я действительно хочу сделать, это круговой FIFO, поэтому start
и end
являются курсорами.
Этот круговой FIFO будет массивом пар целых чисел, например, размером 300: int[][] arr=new int[300][2]
.
При переборе циклического массива я должен позаботиться о том, чтобы счетчик дошел до конца и запустить его с начала, поэтому я решил это так:
if (this.start >= this.end ) temp_end=this.end+this.buff.length;
else temp_end=this.end;
int ii;
int j=0;
int[] value=new int[2];
for(int i=this.start; i<temp_end; i++){
ii=i% this.arr.length;
value=this.buff[ii];
//do anything with value
}
Но я бы хотел не беспокоиться об этих вещах и просто выполнить итерацию простым способом. Я могу сделать это с помощью интерфейса итератора, но тогда у меня есть 2 проблемы: первая, которую я уже объяснил и была решена многими ответами, и второе - мой массив состоит из пар целых чисел, и я не могу использовать итератор с примитивными типами.