自定义一个可以使用增强for循环的类

听说这是一道面试题,兴起研究了下ArrayList的源码熬制而成下列代码,主要使用两个接口:Iterable和Iterator。

要实现一个类可以使用增强for循环

第一步:

使该类实现Iterable,字面理解是:让该类有能力迭代(-able),该接口只有一个需要实现的方法,即:iterator(),方法返回一个迭代器Iterator<T>;

第二步:

定义一个内部类,内部类实现Iterator<T>,该类有大家很熟悉的两个方法:hasNext()和next(),hasNext()用于判断是否还有下一个元素,而next()则是取得下一个元素

上代码:

package test_iterator;
import java.util.Iterator;

public class StudentArray implements Iterable<Student> {

	public Student[] students = new Student[5];

	private  int cursor = 0;
	private int len = students.length;

	public void add(Student stu) {
		if (cursor < len) {
			students[cursor++] = stu;
		}
	}

	public Student get(int index) {
		if(index<len&&index>=0) {
			return students[index];
		}
		return null;
	}
	
	public int size() {
		return cursor;
	}

	public void remove(int cur) {
		if (cur >= 0 && cur <= cursor) {
			for (int i = cur; i < len; i++) {
				if (i + 1 < len) {
					students[i] = students[i + 1];
				}
			}
			len--;
			cursor--;
		} else {
			System.out.println("不在此范围");
		}
	}

	@Override
	public Iterator<Student> iterator() {
		return new StuIterator();
	}

	class StuIterator implements Iterator<Student> {

		int cursor1 = 0;
		@Override
		public boolean hasNext() {
			return cursor1 != len;
		}

		@Override
		public Student next() {
			return get(cursor1++);
		}
	}
}

下面是实体类:

package test_iterator;

public class Student {

	private String name;
	private int age;

	public Student() {
		
	}
	public Student(String name,int age) {
		this.setAge(age);
		this.setName(name);
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
	
	public String toString() {
		return "学生姓名为:"+this.getName()+"\t学生年龄为:"+this.getAge();
	}
}

下面是测试代码:

package test_iterator;

public class Test {
	public static void main(String[] args) {
		StudentArray sArray = new StudentArray();
		sArray.add(new Student("test1", 18));
		sArray.add(new Student("test2", 19));
		sArray.add(new Student("test3", 20));
		sArray.add(new Student("test4", 21));
		sArray.add(new Student("test5", 22));
		
		for (Student student : sArray) {
			System.out.println(student);
		}
	}
}

下面是测试结果:

学生姓名为:test1	学生年龄为:18
学生姓名为:test2	学生年龄为:19
学生姓名为:test3	学生年龄为:20
学生姓名为:test4	学生年龄为:21
学生姓名为:test5	学生年龄为:22

猜你喜欢

转载自blog.csdn.net/zab635590867/article/details/80714446