11、设计模式应用举例:迭代器模式:使用多个集合存储对象

目录

一、关于迭代器模式

二、设计要求

三、设计实现

四、应用程序

五、执行结果


一、关于迭代器模式

设计模式:11、迭代器模式(游标)_游标迭代-CSDN博客

二、设计要求

链表适合插入、删除等操作,但不适合查找和排序。现在有若干个学生,他们有姓名,学号和成绩等属性。

  1. 使用链表存放学生对象。
  2. 用一个散列表和一个树集存放链表中的对象。
  3. 使用散列表查询某个学生。
  4. 通过树集将学生按成绩排序。

三、设计实现

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();
	}

}

五、执行结果

相关推荐
日和雫18 小时前
面向对象与面向过程,谁才是“银弹”?
设计模式
geovindu1 天前
rust: Iterator Pattern
开发语言·后端·设计模式·rust·行为模式·迭代器模
高晶2 天前
ARM 嵌入式 Linux 系统启动流程实战指南
设计模式·程序员
高晶2 天前
BMS 通信开发实战:从 PMBus 协议到数据采集的完整指南
设计模式·程序员
geovindu2 天前
rust:Memento Pattern(续)
开发语言·后端·设计模式·rust·行为模式·备忘录模
电子IT笔记2 天前
老MES登录改造:弱密码和暴破一起治
设计模式
牧瀬クリスだ2 天前
单例模式终极指南:从入门到防破坏
单例模式·设计模式
博风2 天前
9、设计模式应用举例:责任链模式:计算阶乘
设计模式·责任链模式
电子IT笔记2 天前
人走了,记录不能“空白”: MES×HR 离职人员下拉回显实战
设计模式