实验18:迭代器模式

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

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

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

 

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

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

实验要求:

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

2. 提交源代码;

3. 注意编程规范。

1使用方法

JAVA

(1)List 是一个有序集合,允许重复的元素。在 Java 中常用的 List 实现包括 ArrayList  LinkedList。

ArrayList:底层使用动态数组实现,支持快速随机访问。

LinkedList:底层使用双向链表实现,适合频繁插入和删除元素。

实现方法:import java.util.*;

 

public class ListExample {

    public static void main(String[] args) {

        // 使用 ArrayList 实现 List

        List<String> list = new ArrayList<>();

        list.add("Java");

        list.add("C++");

        list.add("Python");

 

        // 迭代器遍历

        Iterator<String> iterator = list.iterator();

        while (iterator.hasNext()) {

            System.out.println(iterator.next());

        }

 

        // 使用 LinkedList

        List<Integer> linkedList = new LinkedList<>();

        linkedList.add(1);

        linkedList.add(2);

        linkedList.add(3);

 

        // 增强 for 循环遍历

        for (Integer number : linkedList) {

            System.out.println(number);

        }

    }

}

 

2)Set 是一个无序集合,不允许重复元素。在 Java 中常用的 Set 实现包括 HashSet  TreeSet。

HashSet:底层使用哈希表实现,元素是无序的。

TreeSet:底层使用红黑树实现,元素会自动按升序排序。

实现方法:import java.util.*;

 

public class SetExample {

    public static void main(String[] args) {

        // 使用 HashSet 实现 Set

        Set<String> set = new HashSet<>();

        set.add("Java");

        set.add("C++");

        set.add("Python");

 

        // 迭代器遍历

        Iterator<String> iterator = set.iterator();

        while (iterator.hasNext()) {

            System.out.println(iterator.next());

        }

 

        // 使用 TreeSet

        Set<Integer> treeSet = new TreeSet<>();

        treeSet.add(3);

        treeSet.add(1);

        treeSet.add(2);

 

        // 增强 for 循环遍历

        for (Integer number : treeSet) {

            System.out.println(number);

        }

    }

}

 

3)Map 是一个键值对集合,不允许重复的键。在 Java 中常用的 Map 实现包括 HashMap  TreeMap。

HashMap:底层使用哈希表实现,键值对无序。

TreeMap:底层使用红黑树实现,键按升序排序。

实现方法:import java.util.*;

 

public class MapExample {

    public static void main(String[] args) {

        // 使用 HashMap 实现 Map

        Map<Integer, String> map = new HashMap<>();

        map.put(1, "Java");

        map.put(2, "C++");

        map.put(3, "Python");

 

        // 通过键遍历

        for (Map.Entry<Integer, String> entry : map.entrySet()) {

            System.out.println(entry.getKey() + ": " + entry.getValue());

        }

 

        // 使用 TreeMap

        Map<Integer, String> treeMap = new TreeMap<>();

        treeMap.put(3, "Java");

        treeMap.put(1, "C++");

        treeMap.put(2, "Python");

 

        // 遍历

        for (Map.Entry<Integer, String> entry : treeMap.entrySet()) {

            System.out.println(entry.getKey() + ": " + entry.getValue());

        }

    }

}

C++

(1)vector 是一个动态数组,支持快速随机访问,元素按插入顺序排列

实现方法:#include <iostream>

#include <vector>

using namespace std;

 

int main() {

    vector<string> vec = {"Java", "C++", "Python"};

 

    // 迭代器遍历

    for (vector<string>::iterator it = vec.begin(); it != vec.end(); ++it) {

        cout << *it << endl;

    }

 

    // 增强 for 循环遍历

    for (const auto& str : vec) {

        cout << str << endl;

    }

 

    return 0;

}

(2)list 是双向链表实现的容器,适用于频繁的插入和删除操作。

实现方法:#include <iostream>

#include <list>

using namespace std;

 

int main() {

    list<int> myList = {1, 2, 3, 4, 5};

 

    // 迭代器遍历

    for (list<int>::iterator it = myList.begin(); it != myList.end(); ++it) {

        cout << *it << " ";

    }

    cout << endl;

 

    // 增强 for 循环遍历

    for (const auto& num : myList) {

        cout << num << " ";

    }

    cout << endl;

 

    return 0;

}

(3)set 是一个不允许重复元素的集合,元素按升序排列。

实现方法:#include <iostream>

#include <set>

using namespace std;

 

int main() {

    set<string> mySet = {"Java", "C++", "Python"};

 

    // 迭代器遍历

    for (set<string>::iterator it = mySet.begin(); it != mySet.end(); ++it) {

        cout << *it << endl;

    }

 

    // 增强 for 循环遍历

    for (const auto& str : mySet) {

        cout << str << endl;

    }

 

    return 0;

}

(4)map 是一个有序的键值对集合,键不重复。

实现方法:#include <iostream>

#include <map>

using namespace std;

 

int main() {

    map<int, string> myMap = {{1, "Java"}, {2, "C++"}, {3, "Python"}};

 

    // 迭代器遍历

    for (map<int, string>::iterator it = myMap.begin(); it != myMap.end(); ++it) {

        cout << it->first << ": " << it->second << endl;

    }

 

    // 增强 for 循环遍历

    for (const auto& entry : myMap) {

        cout << entry.first << ": " << entry.second << endl;

    }

 

    return 0;

}

 

 

2、源代码

C++

#include<iostream>

#include <vector>

#include<algorithm>

using namespace std;

class Student{

public:

     long studentid;

     string name;

     int age;

     string major;

public:

     Student(long studentid, string name, int age, string major) {

        this->studentid = studentid;

        this->name = name;

        this->age = age;

        this->major = major;

    }

    void show(){

        cout<<"姓名: "<<this->name<<"\t学号: "<<this->studentid <<"\t年龄: "<< this->age<< "\t专业: " << this->major<<endl;

    }

};

bool compMax(Student *a,Student *b){

    if (a->studentid> b->studentid)

         return true;

     else

         return false;

}

bool compMin(Student *a,Student *b){

    if (a->studentid< b->studentid)

         return true;

     else

         return false;

}

int main(){

    Student *s1 = new Student(20223794, "袁", 20, "软工");

    Student *s2 = new Student(20224056, "高", 21, "软工");

    Student *s3 = new Student(20223782, "艾", 21, "软工");

    Student *s4 = new Student(20223695, "万", 20, "软工");

    vector<Student*> vec;

    vec.push_back(s1);

    vec.push_back(s2);

    vec.push_back(s3);

    vec.push_back(s4);

    cout<<"按照学号从大到小输出: "<<endl;

    vector<Student*>::iterator it;

    sort(vec.begin(), vec.end(),compMax);

    for(it=vec.begin();it!=vec.end();it++){

        (*it)->show();

    }

    cout<<"-----------------------------------------------------------------"<<endl;

    cout<<"按照学号从小到大输出: "<<endl;

    sort(vec.begin(), vec.end(),compMin);

    for(it=vec.begin();it!=vec.end();it++){

        (*it)->show();

    }

}

 

JAVA

package org.example;

class Student {
    String name;
    int studentId;
    int age;
    String major; // 添加专业属性

    public Student(String name, int studentId, int age, String major) {
        this.name = name;
        this.studentId = studentId;
        this.age = age;
        this.major = major; // 初始化专业
    }

    @Override
    public String toString() {
        return "姓名: " + name + ", 学号: " + studentId + ", 年龄: " + age + ", 专业: " + major;
    }
}

package org.example;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

public class StudentIterator {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        // 创建学生对象时添加专业
        students.add(new Student("袁", 20223794, 20, "软工"));
        students.add(new Student("高", 20224056, 21, "软工"));
        students.add(new Student("艾", 20223782, 21, "软工"));
        students.add(new Student("万", 20223695, 20, "软工"));

        // 按学号从小到大排序
        students.sort(Comparator.comparingInt(s -> s.studentId));
        System.out.println("按学号从小到大排序:");
        Iterator<Student> iterator = students.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        // 按学号从大到小排序
        students.sort((s1, s2) -> Integer.compare(s2.studentId, s1.studentId));
        System.out.println("\n按学号从大到小排序:");
        iterator = students.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

 

3、运行截图

C++

 

JAVA

 

posted @ 2024-11-18 09:11  不会JAVA的小袁  阅读(14)  评论(0编辑  收藏  举报