Вы всегда получаете новый итератор - вместо того, чтобы использовать тот же самый.
Мне непонятно, почему вы все равно делаете это; либо передайте целое число и цикл, пока он не закончится, или переберите фигуры и сохраните счетчик. Передача массива строк кажется мне неуклюжей.
public void printShapes() {
int i = 1;
for (Shape shape : shapes) {
shape.printMe(i++); // And modify the method to take an int.
}
}
Мне неудобно, когда фигура должна знать, что она может иметь позицию. Если это является обязательным требованием, создайте «PositionalShape» или что-то (но ew) или используйте формы для вывода строкового представления, которое может быть скомбинировано с дополнительной информацией, такой как позиция списка, или создать декоратор формы и т. Д.
// (If you're really trying to print the first n shapes)
public void printShapes(int n) {
Iterator<Shape> iter = shapes.iterator();
for (int i = 0; i < n; i++) {
Shape shape = iter.next();
shape.printMe("" + i+1);
}
}