本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 

1、理解迭代器模式的动机,掌握该模式的结构;

2、能够利用迭代器模式解决实际问题。

 

[实验任务一]JAVAC++常见数据结构迭代器的使用

1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。

实验要求:

1. 搜集并掌握JAVAC++中常见的数据结构和迭代器的使用方法,例如,vector, list, mapset等;

2. 提交源代码;

3. 注意编程规范。

 

list是 是一个接口,它继承自 Collection 接口。List 接口代表一个有序的元素序列,允许元素重复。这意味着你可以按照添加顺序存储一组元素,而且允许相同的元素多次出现。List 接口提供了许多方法来操作列表中的元素,包括添加、删除、获取、搜索等。

Map(也称为字典、关联数组)是用于保存具有映射关系的数据,保存两组值,keyvalue,这两组值可以是任何应用类型的数据。Mapkey不允许重复(底层MapkeySet()返回的是keySet集合,所以key不会重复),即Map中对象的任意两个key通过equals()方法得到的都是false。而,Mapvalue值是可以重复的(Map的底层values()方法返回类型是Collection,可以存储重复元素),通过key总能找到唯一的valueMap中的key组成一个Set集合,所以可以通过keySet()方法返回所有keySet底层也是通过Map实现的,只不过value都是nullMap来实现的。

SetList一样,也继承于Collection,是集合的一种。和List不同的是,Set内部实现是基于Map的,所以Set取值时不保证数据和存入的时候顺序一致,并且不允许空值,不允许重复值。

模板类vector是数组的替代品。模板类vector 类似于string类,也是一种动态数组。 在 c++ 中,vector 是一个十分有用的容器。它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

List 是一种有序、可重复的元素集合,支持按顺序访问和操作元素;Set 是一个不允许重复元素的集合,底层通常基于 Map 实现,不保证元素顺序;Map 用于存储键值对,其中键必须唯一且不可重复,值可以重复,通过键可以高效查找对应的值;vector C++ 中的动态数组模板类,类似于 Java ArrayList,支持存储任意类型的数据,并可以自动调整大小。这些集合类型各自具有不同的特性,适用于不同的数据存储场景。

  1. 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();

        }

    }

}

 

  1. 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;

    }

}

 

  1. 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();

}

posted on 2024-11-18 15:38  许七安gyg  阅读(15)  评论(0)    收藏  举报