软件设计模式————(迭代器模式)

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

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

实验要求:

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

2. 提交源代码;

3. 注意编程规范。

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;

}

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

实现方法:#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());
        }
    }
}

 

 

posted @ 2024-11-21 15:24  财神给你送元宝  阅读(1)  评论(0编辑  收藏  举报