软件设计模式————(迭代器模式)
[实验任务一]: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; } (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()); } } }