本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解迭代器模式的动机,掌握该模式的结构;
2、能够利用迭代器模式解决实际问题。
[实验任务一]:JAVA和C++常见数据结构迭代器的使用
信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。
实验要求:
1. 搜集并掌握JAVA和C++中常见的数据结构和迭代器的使用方法,例如,vector, list, map和set等;
2. 提交源代码;
3. 注意编程规范。
list是 是一个接口,它继承自 Collection 接口。List 接口代表一个有序的元素序列,允许元素重复。这意味着你可以按照添加顺序存储一组元素,而且允许相同的元素多次出现。List 接口提供了许多方法来操作列表中的元素,包括添加、删除、获取、搜索等。
Map(也称为字典、关联数组)是用于保存具有映射关系的数据,保存两组值,key和value,这两组值可以是任何应用类型的数据。Map的key不允许重复(底层Map的keySet()返回的是key的Set集合,所以key不会重复),即Map中对象的任意两个key通过equals()方法得到的都是false。而,Map的value值是可以重复的(Map的底层values()方法返回类型是Collection,可以存储重复元素),通过key总能找到唯一的value,Map中的key组成一个Set集合,所以可以通过keySet()方法返回所有key。Set底层也是通过Map实现的,只不过value都是null的Map来实现的。
Set和List一样,也继承于Collection,是集合的一种。和List不同的是,Set内部实现是基于Map的,所以Set取值时不保证数据和存入的时候顺序一致,并且不允许空值,不允许重复值。
模板类vector是数组的替代品。模板类vector 类似于string类,也是一种动态数组。 在 c++ 中,vector 是一个十分有用的容器。它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。
List 是一种有序、可重复的元素集合,支持按顺序访问和操作元素;Set 是一个不允许重复元素的集合,底层通常基于 Map 实现,不保证元素顺序;Map 用于存储键值对,其中键必须唯一且不可重复,值可以重复,通过键可以高效查找对应的值;vector 是 C++ 中的动态数组模板类,类似于 Java 的 ArrayList,支持存储任意类型的数据,并可以自动调整大小。这些集合类型各自具有不同的特性,适用于不同的数据存储场景。
- Student.java
|
package org.example;
/** * @author IronBro * @version 1.0 * @description: TODO */ 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(); } } }
|
- Iterators.java
|
package org.example;
/** * @author IronBro * @version 1.0 * @description: TODO */ 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.txt"); List<Student> list = getStudents(is);
System.err.println("学号从小到大:"); Iterator<Student> iterator = list.iterator(); while(iterator.hasNext()){ Student student = iterator.next(); System.out.println(student); } System.err.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; } }
|
- student.cpp
|
#include <string> #include <vector> #include <iostream> #include <fstream> using namespace std; struct student { string id; string name; }; void LoadStudent(vector<student>&); int main() { vector<student> v,v1; LoadStudent(v); LoadStudent(v1); cout<<"学号从小到大:"<<endl; for (vector<student>::iterator iter = v.begin(); iter != v.end(); ++iter) { cout << "学号:" << iter->id << " 姓名:" << iter->name << endl; } cout<<"***********************"<<endl; cout<<"学号从大到小:"<<endl; for (vector<student>::reverse_iterator iter1 = v.rbegin(); iter1 != v.rend(); ++iter1) { cout << "学号:" << iter1->id << " 姓名:" << iter1->name << endl; } return 0; } void LoadStudent(vector<student>& v) { ifstream infile; infile.open("Student.txt"); student s; if(!infile) { cout<<"读入文件不存在"<<endl; } if (infile.is_open()) { while (infile.good()&&!infile.eof()) { infile>>s.id>>s.name; v.push_back(s); } } infile.close(); } |
浙公网安备 33010602011771号