迭代器的定义为:提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。同时迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象。与聚合对象耦合,在一定程度上限制了它的广泛运用,一般仅用于底层聚合支持类。
Java中的iterator功能比较简单,并且只能单向移动;
1.使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。
(注意:iterator()方法是java.lang.Iterable接口,被Collection继承。)
2. 使用next()获得序列中的下一个元素。
3. 使用hasNext()检查序列中是否还有元素。
Iterator是Java迭代器最简单的实现,例:
首先使用Comparable排序接口并封装nubmer、name、score;
class PiXu implements Comparable<PiXu>{
private int number;
private int name;
private int score;
public PiXu(int number, int name, int score) {
super();
this.number = number;
this.name = name;
this.score = score;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public int getName() {
return name;
}
public void setName(int name) {
this.name = name;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public int compareTo(PiXu o) {
// TODO Auto-generated method stub
if (this.score!=o.score) {
return o.score-this.score;
} else {
return this.number-o.number;
}
}
}
利用Random类和ArrayList向List中加入数据,并使用sort排序:
List<PiXu>list = new ArrayList<>();
for (int i = 1; i <41; i++) {
Random random = new Random();
int k = 50 +random.nextInt(51);
list.add(new PiXu(i, i, k));
}
Collections.sort(list);
最后使用迭代器遍历输出列表数据:
Iterator<PiXu> iterator = list.iterator();
while (iterator.hasNext()) {
PiXu piXu = (PiXu) iterator.next();
if (piXu.getName()<10) {
System.out.println("姓名:学生0"+piXu.getName()+" "+"学号:17010"+piXu.getNumber()+" "+"成绩"+piXu.getScore());
} else {
System.out.println("姓名:学生"+piXu.getName()+" "+"学号:1701"+piXu.getNumber()+" "+"成绩"+piXu.getScore());
}
}
完整代码如下:
public static void main(String[] args) {
List<PiXu>list = new ArrayList<>();
for (int i = 1; i <41; i++) {
Random random = new Random();
int k = 50 +random.nextInt(51);
list.add(new PiXu(i, i, k));
}
Collections.sort(list);
Iterator<PiXu> iterator = list.iterator();
while (iterator.hasNext()) {
PiXu piXu = (PiXu) iterator.next();
if (piXu.getName()<10) {
System.out.println("姓名:学生0"+piXu.getName()+" "+"学号:17010"+piXu.getNumber()+" "+"成绩"+piXu.getScore());
} else {
System.out.println("姓名:学生"+piXu.getName()+" "+"学号:1701"+piXu.getNumber()+" "+"成绩"+piXu.getScore());
}
}
}
效果如下:
Iterator模式有三个重要的作用:
- 它支持以不同的方式遍历一个聚合 复杂的聚合可用多种方式进行遍历,如二叉树的遍历,可以采用前序、中序或后序遍历。迭代器模式使得改变遍历算法变得很容易: 仅需用一个不同的迭代器的实例代替原先的实例即可,你也可以自己定义迭代器的子类以支持新的遍历,或者可以在遍历中增加一些逻辑,如有条件的遍历等。
- 迭代器简化了聚合的接口,有了迭代器的遍历接口,聚合本身就不再需要类似的遍历接口了,这样就简化了聚合的接口。
- 在同一个聚合上可以有多个遍历 每个迭代器保持它自己的遍历状态,因此可以同时进行多个遍历。
- Iterator模式可以为遍历不同的聚合结构(需拥有相同的基类)提供一个统一的接口,即支持多态迭代。