создание итератора для кастомного класса
Пытаюсь создать итератор для кастомного класса в java.У меня есть класс FullName
package com.company;
import java.util.Iterator;
public class FullName {
private String surname;
private String name;
private int age;
public FullName(String surname, String name, int age) {
this.surname = surname;
this.name = name;
this.age = age;
}
public String getSurname() {
return this.surname;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
public void printFullName(){
System.out.println("name: " + name + " surname: " + surname + " age: " + age);
}
}
и класс,который хранит массив таких структур: FullNameCollections
public class FullNameCollections {
private static FullName [] arrFullname;
public FullNameCollections(String[] name){
arrFullname = new FullName[name.length];
for(int i = 0; i < name.length; i++){
FullName tmp = new FullName("mr " + name[i], name[i],(int)(1 + Math.random()*100));
arrFullname[i] = tmp;
}
}
public int getSize(){
return arrFullname.length;
}
public static FullName[] getArr(){
return arrFullname;
}
public FullNameIterator iterator() {
return new FullNameIterator(this);
}
}
public class FullNameIterator implements Iterator<FullNameCollections> {
private FullNameCollections fullNameCollections;
private int indexEl;
public FullNameIterator(FullNameCollections fullNameCollections) {
this.fullNameCollections = fullNameCollections;
indexEl = fullNameCollections.getSize();
}
@Override
public boolean hasNext() {
if (indexEl >= 0) {
return true;
} else {
return false;
}
}
@Override
public FullNameCollections next(){
FullName[] tmp = FullNameCollections.getArr();
indexEl--;
return (FullNameCollections)tmp[indexEl];
}
}
В его конструкторе создаю массив структур(класса FullName). Создал класс итератора для работа с этой коллекцией.Но метод next я не могу определить так,что бы он возвращал объект класса FullName,который я мог бы вывести на консоль во внешнем коде через метод print То есть, я хочу:
String [] str = {"Вася","Даша","Даша"};
FullNameCollections fullNameCollections = new FullNameCollections(str);
Iterator iter = fullNameCollections.iterator();
while (iter.hasNext()) {
FullName fullName = iter.next();
fullName.printFullName();
}
Подскажите пожалуйста, как можно это реализовать,ибо возвращаемый тип данных в методе next() может быть только FullNameCollections
Ответы (1 шт):
Автор решения: StateItPrimitive
→ Ссылка
Пример реализации:
public class FullNameCollections implements Iterable<FullName> {
private final FullName[] array;
public FullNameCollections(String[] name) {
array = new FullName[name.length];
for (int i = 0; i < name.length; i++) {
array[i] = new FullName("mr " + name[i], name[i], new Random().nextInt(100));
}
}
public int getSize() {
return array.length;
}
@Override
public Iterator<FullName> iterator() {
return new Iterator<FullName>() {
private int index;
@Override
public boolean hasNext() {
return index < array.length;
}
@Override
public FullName next() {
return array[index++];
}
};
}
}
Пример использования:
public class Example {
public static void main(String[] args) {
String[] strings = {"123", "456", "789"};
// конструкция for each, на самом деле (при компиляции), разворачиватеся в итератор
for (FullName fullName : new FullNameCollections(strings)) {
fullName.printFullName();
}
}
}