软件设计十八
实验18:迭代器模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解迭代器模式的动机,掌握该模式的结构;
2、能够利用迭代器模式解决实际问题。
[实验任务一]:JAVA和C++常见数据结构迭代器的使用
信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。
实验要求:
1. 搜集并掌握JAVA和C++中常见的数据结构和迭代器的使用方法,例如,vector, list, map和set等;
1. List 接口
组成特点
- **有序**,元素可以重复。
- 实现类:`ArrayList`、`LinkedList`、`Vector`。
常用方法
- `add(E e)`:添加元素。
- `get(int index)`:按索引获取元素。
- `remove(int index)`:按索引删除元素。
- `size()`:获取元素个数。
- `contains(Object o)`:检查是否包含某元素。
---
2. Set 接口
组成特点
- **无序**,元素**不重复**。
- 实现类:`HashSet`、`TreeSet`、`LinkedHashSet`。
常用方法
- `add(E e)`:添加元素。
- `remove(Object o)`:删除元素。
- `contains(Object o)`:检查是否包含某元素。
- `size()`:获取元素个数。
- `isEmpty()`:检查是否为空。
---
3. Map 接口
组成特点
- 键值对存储,**键唯一**,值可重复。
- 实现类:`HashMap`、`TreeMap`、`LinkedHashMap`、`Hashtable`。
常用方法
- `put(K key, V value)`:添加键值对。
- `get(Object key)`:根据键获取值。
- `remove(Object key)`:删除键值对。
- `containsKey(Object key)`:检查是否包含键。
- `containsValue(Object value)`:检查是否包含值。
- `keySet()`:返回所有键。
- `values()`:返回所有值。
---
4. Vector
组成特点
- 动态数组,**线程安全**。
- 属于 `List` 的一种实现。
常用方法
- `add(E e)`:添加元素。
- `remove(int index)`:按索引删除元素。
- `get(int index)`:获取元素。
- `size()`:获取元素个数。
- `capacity()`:返回当前容量。
---
5. Stack
组成特点
- 基于 `Vector` 实现的 **后进先出(LIFO)** 数据结构。
常用方法
- `push(E e)`:元素入栈。
- `pop()`:元素出栈。
- `peek()`:查看栈顶元素。
- `isEmpty()`:检查是否为空。
6. Queue 接口
组成特点
- **先进先出(FIFO)** 数据结构。
- 实现类:`LinkedList`、`PriorityQueue`。
常用方法
- `offer(E e)`:入队。
- `poll()`:出队,返回并移除队首元素。
- `peek()`:查看队首元素。
- `isEmpty()`:检查是否为空。
- `size()`:获取元素个数。
2. 提交源代码;
//Student.java
public class Student{
private String id;
private String name;
private String age;
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public Student(){}
public Student(String id,String name,String age){
this.id = id;
this.name = name;
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "学号=" + id + ", 名字=" + name + ", 年龄=" + age;
}
public static Student fromString(String s){
String[] split = s.split(";");
if(split.length==3){
return new Student(split[0],split[1],split[2]);
}else{
throw new RuntimeException("不能从字符串‘"+s+"’解析出"+Student.class+"类型的对象!");
}
}
}
//Iterators.java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
public class Iterators {
public static void main(String[] args) {
InputStream is = Iterators.class.getClassLoader().getResourceAsStream("student_info.txt");
List<Student> list = getStudents(is);
System.out.println("学号从小到大:");
Iterator<Student> iterator = list.iterator();
while(iterator.hasNext()){
Student student = iterator.next();
System.out.println(student);
}
System.out.println("学号从大到小:");
ListIterator<Student> li=list.listIterator();
for(li=list.listIterator();li.hasNext();) {
li.next();
}
for(;li.hasPrevious();) {
Student student = li.previous();
System.out.println(student);
}
}
private static List<Student> getStudents(InputStream is){
List<Student> list = new LinkedList<>();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String temp = null;
try {
while((temp=reader.readLine())!=null){
Student student = Student.fromString(temp);
list.add(student);
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
}
3. 运行结果


浙公网安备 33010602011771号