迭代器模式
实验18:迭代器模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解迭代器模式的动机,掌握该模式的结构;
2、能够利用迭代器模式解决实际问题。
[实验任务一]:JAVA和C++常见数据结构迭代器的使用
信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。
实验要求:
1. 搜集并掌握JAVA和C++中常见的数据结构和迭代器的使用方法,例如,vector, list, map和set等;
JAVA和C++中常见的迭代器
List接口:
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
Vector类:
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
Set接口:
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。
Map接口:
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
2. 提交源代码;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
// 定义学生类
class Student {
private String name;
private String studentId;
private int age;
public Student(String name, String studentId, int age) {
this.name = name;
this.studentId = studentId;
this.age = age;
}
public String getName() {
return name;
}
public String getStudentId() {
return studentId;
}
public int getAge() {
return age;
}
}
public class StudentInfoTraversalJava {
public static void main(String[] args) {
// 创建学生列表
List<Student> students = new ArrayList<>();
students.add(new Student("张三", "001", 20));
students.add(new Student("李四", "002", 21));
students.add(new Student("王五", "003", 19));
// 此处可继续添加更多学生信息,共44名
// 按照学号从小到大排序并遍历输出
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s1.getStudentId().compareTo(s2.getStudentId());
}
});
System.out.println("按照学号从小到大输出学生信息:");
Iterator<Student> iteratorAsc = students.iterator();
while (iteratorAsc.hasNext()) {
Student student = iteratorAsc.next();
System.out.println("姓名:" + student.getName() + ",学号:" + student.getStudentId() + ",年龄:" + student.getAge());
}
// 按照学号从大到小排序并遍历输出
Collections.sort(students, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s2.getStudentId().compareTo(s1.getStudentId());
}
});
System.out.println("按照学号从大到小输出学生信息:");
Iterator<Student> iteratorDesc = students.iterator();
while (iteratorDesc.hasNext()) {
Student student = iteratorDesc.next();
System.out.println("姓名:" + student.getName() + ",学号:" + student.getStudentId() + ",年龄:" + student.getAge());
}
}
}
#include <iostream>
#include <vector>
#include <algorithm>
// 定义学生结构体
struct Student {
std::string name;
std::string studentId;
int age;
Student(const std::string& name, const std::string& studentId, int age) :
name(name), studentId(studentId), age(age) {}
};
// 比较函数,用于按照学号从小到大排序
bool compareByIdAsc(const Student& s1, const Student& s2) {
return s1.studentId < s2.studentId;
}
// 比较函数,用于按照学号从大到小排序
bool compareByIdDesc(const Student& s1, const Student& s2) {
return s1.studentId > s2.studentId;
}
int main() {
// 创建学生向量
std::vector<Student> students;
students.push_back(Student("张三", "001", 20));
students.push_back(Student("李四", "002", 21));
students.push_back(Student("王五", "003", 19));
// 此处可继续添加更多学生信息,共44名
// 按照学号从小到大排序并遍历输出
std::sort(students.begin(), students.end(), compareByIdAsc);
std::cout << "按照学号从小到大输出学生信息:" << std::endl;
for (const auto& student : students) {
std::cout << "姓名:" << student.name << ",学号:" << student.studentId << ",年龄:" << student.age << std::endl;
}
// 按照学号从大到小排序并遍历输出
std::sort(students.begin(), students.end(), compareByIdDesc);
std::cout << "按照学号从大到小输出学生信息:" << std::endl;
for (const auto& student : students) {
std::cout << "姓名:" << student.name << ",学号:" << student.studentId << ",年龄:" << student.age << std::endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)