目录
一、关于迭代器模式
二、设计要求
链表适合插入、删除等操作,但不适合查找和排序。现在有若干个学生,他们有姓名,学号和成绩等属性。
- 使用链表存放学生对象。
- 用一个散列表和一个树集存放链表中的对象。
- 使用散列表查询某个学生。
- 通过树集将学生按成绩排序。
三、设计实现
Student.java
java
package xyz.jangle.design.app.iterator;
/**
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月17日 上午10:41:59
*
*/
public class Student implements Comparable<Student> {
private String number,name;
private double score=0;
public Student(String number, String name, double score) {
super();
this.number = number;
this.name = name;
this.score = score;
}
@Override
public int compareTo(Student o) {
// 如果两个分数相等,会被TreeSet剔除,所以使相近的分数返回1
if(Math.abs(this.score - o.score) <= 1/10000) {
return 1;
}
return (int) ((this.score - o.score)*1000);
}
public String getNumber() {
return number;
}
public String getName() {
return name;
}
public double getScore() {
return score;
}
}
UseSet.java
java
package xyz.jangle.design.app.iterator;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.TreeSet;
/**
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月17日 上午11:13:02
*
*/
public class UseSet {
private LinkedList<Student> list;
private Hashtable<String, Student> table;
private TreeSet<Student> tree;
public UseSet() {
list = new LinkedList<Student>();
table = new Hashtable<String, Student>();
tree = new TreeSet<Student>();
}
public void addStudent(Student stu) {
list.add(stu);
update();
}
/**
* 查询指定学号的学生信息
*
* @author jangle
* @time 2026年10月17日 上午11:24:19
* @param num
*/
public void lookStudent(String num) {
Student student = table.get(num);
System.out.println("学号:"+student.getNumber()+" 姓名:"+student.getName()+" 分数:"+student.getScore());
}
/**
* 按分数升序打印学生信息
*
* @author jangle
* @time 2026年10月17日 上午11:24:32
*/
public void printStudentByScore() {
Iterator<Student> iterator = tree.iterator();
while(iterator.hasNext()) {
Student student = iterator.next();
System.out.println("学号:"+student.getNumber()+" 姓名:"+student.getName()+" 分数:"+student.getScore());
}
}
private void update() {
tree.clear();
Iterator<Student> iterator = list.iterator();
while(iterator.hasNext()) {
Student student = iterator.next();
table.put(student.getNumber(), student);
tree.add(student);
}
}
}
四、应用程序
java
package xyz.jangle.design.app.iterator;
/**
* @author jangle
* @email jangle@jangle.xyz
* @time 2026年10月17日 上午11:28:09
*
*/
public class Application {
public static void main(String[] args) {
UseSet useSet = new UseSet();
useSet.addStudent(new Student("001","张三",76.89));
useSet.addStudent(new Student("002","李四",88.89));
useSet.addStudent(new Student("003","刘五",58.12));
useSet.addStudent(new Student("004","赵六",66.55));
useSet.addStudent(new Student("005","周七",92.57));
useSet.addStudent(new Student("006","胡",92.57));
String n = "003";
System.out.println("查找学号为"+n+"的学生:");
useSet.lookStudent(n);
System.out.println("将学生按成绩排序");
useSet.printStudentByScore();
}
}
五、执行结果
