代码改变世界

支持foreach迭代访问的自定义集合类

2011-06-03 10:15  Rollen Holt  阅读(828)  评论(1编辑  收藏  举报
import java.util.Iterator;  
  
//测试类  
public class Exec {  
    public static void main(String[] args) throws Exception {  
        // 创建学生集合类  
        Students students = new Students(10);  
  
        // 通过for each语句迭代循环学生集合类的每个元素  
        for (Object obj : students) {  
            Student stu = (Student) obj;  
            System.out.println(stu.getSid() + ":" + stu.getName());  
        }  
    }  
}  
  
// 支持for each迭代循环的学生集合类  
class Students implements Iterable {  
    // 存储所有学生类的数组  
    private Student[] stus;  
  
    // 该构造函数可以生成指定大小的学生类变量数组,并初始化该学生类变量数组  
    public Students(int size) {  
        stus = new Student[size];  
        for (int i = 0; i < size; i++) {  
            stus[i] = new Student(String.valueOf(i), "学生" + String.valueOf(i));  
        }  
    }  
  
    // 实现Iterable接口的重要方法,返回自定义的迭代类变量  
    public Iterator iterator() {  
        return new StudentIterator();  
    }  
  
    // 实现Iterator接口的私有内部类,外界无法直接访问  
    private class StudentIterator implements Iterator {  
        // 当前迭代元素的下标  
        private int index = 0;  
  
        // 判断是否还有下一个元素,如果迭代到最后一个元素就返回false  
        public boolean hasNext() {  
            return index != stus.length;  
        }  
  
        // 返回当前元素数据,并递增下标  
        public Object next() {  
            return stus[index++];  
        }  
  
        // 这里不支持,抛出不支持操作异常  
        public void remove() {  
            throw new UnsupportedOperationException();  
        }  
    }  
}  
  
// 学生类  
class Student {  
    // 学生学号  
    private String sid;  
  
    // 学生姓名  
    private String name;  
  
    // 默认构造函数  
    public Student() {  
    }  
  
    // 支持属性值初始化的构造函数  
    public Student(String sid, String name) {  
        setSid(sid);  
        setName(name);  
    }  
  
    // 学生学号的读取函数  
    public String getSid() {  
        return sid;  
    }  
  
    // 学生学号的设置函数  
    public void setSid(String sid) {  
        this.sid = sid;  
    }  
  
    // 学生姓名的读取函数  
    public String getName() {  
        return name;  
    }  
  
    // 学生姓名的设置函数  
    public void setName(String name) {  
        this.name = name;  
    }  
  
    // 格式化字符信息输出  
    public String toString() {  
        return this.sid + ":" + this.name;  
    }  
}