2024/11/23
软件设计实验十八
[实验任务一]:JAVA和C++常见数据结构迭代器的使用 信1305班共44名同学,每名同学都有姓名,学号和年龄等属性,分别使用JAVA内置迭代器和C++中标准模板库(STL)实现对同学信息的遍历,要求按照学号从小到大和从大到小两种次序输出学生信息。 实验要求: 1. 搜集并掌握JAVA和C++中常见的数据结构和迭代器的使用方法,例如,vector, list, map和set等; 一、Java: ArrayList(类似vector) 数据结构特点:是动态数组,能自动调整大小。存储元素有序,可存储重复元素。基于数组实现,内存中元素连续存储,随机访问效率高,但插入和删除中间元素时可能涉及较多数据移动。 迭代器使用方法:通过iterator()方法获取迭代器对象,迭代器提供hasNext()方法判断是否还有下一个元素,next()方法用于获取下一个元素,以此实现遍历。 LinkedList(类似list) 数据结构特点:双向链表结构,支持高效的插入和删除操作,特别是在中间位置。元素在内存中不是连续存储的,不适合随机访问,但在频繁插入和删除场景下表现较好。 迭代器使用方法:和ArrayList类似,利用iterator()获取迭代器,然后用hasNext()和next()方法来遍历链表中的元素。 HashMap(类似map) 数据结构特点:基于哈希表实现的键 - 值对存储结构。键是唯一的,通过哈希函数快速定位元素,提供高效的插入、删除和查找操作,元素存储顺序与插入顺序无关。 迭代器使用方法:通过entrySet().iterator()获取键值对的迭代器,迭代器返回的对象包含getKey()和getValue()方法,用于获取键和值,从而实现对键值对的遍历。 HashSet(类似set) 数据结构特点:基于哈希表实现的集合,用于存储不重复的元素。内部利用哈希函数和哈希冲突解决机制来保证元素的唯一性,元素无序。 迭代器使用方法:使用iterator()获取迭代器,通过hasNext()和next()方法来遍历集合中的元素。 二、C++ vector 数据结构特点:动态数组,能自动管理内存大小。元素在内存中连续存储,随机访问效率高,支持快速访问和修改元素。在尾部插入和删除元素效率高,但在中间插入或删除元素可能导致大量元素移动。 迭代器使用方法:通过begin()和end()方法获取迭代器,迭代器支持自增操作,通过解引用操作符*获取迭代器指向的元素,用于遍历整个vector。在 C++11 及以上版本还可以使用范围 - for 循环来简洁地遍历。 list 数据结构特点:双向链表,元素在内存中不连续存储。在任意位置插入和删除元素效率高,但随机访问效率低,因为要从链表头或链表尾开始遍历找到指定元素。 迭代器使用方法:和vector类似,通过begin()和end()获取迭代器,迭代器自增可以遍历链表,利用解引用操作符*获取元素进行操作。 map 数据结构特点:关联容器,以键 - 值对形式存储数据。键是唯一的,元素会按照键的顺序自动排序(默认升序),基于红黑树实现,插入、删除和查找操作的时间复杂度相对稳定。 迭代器使用方法:通过begin()和end()获取迭代器,迭代器指向的对象包含first(键)和second(值)成员,可以通过它们访问键值对,实现对map的遍历。 set 数据结构特点:关联容器,存储不重复的元素集合。元素会自动排序(默认升序),基于红黑树实现,查找、插入和删除操作效率较高,用于快速判断元素是否存在以及去重。 迭代器使用方法:利用begin()和end()获取迭代器,通过迭代器的自增和解引用操作来遍历集合中的元素,用于检查元素或者输出元素。 2. 提交源代码; JAVA: public class Student implements Comparable<Student>{ private int studentid; private String name; private int age; private String major; public Student(int studentid, String name, int age, String major) { super(); this.studentid = studentid; this.name = name; this.age = age; this.major = major; } // 三个返回结果都要写出来 public int compareTo(Student o) { if(this.studentid > o.studentid){ return -1; }else if(this.studentid < o.studentid){ return 1; }else { return 0; } } @Override public String toString(){ return "姓名: " + this.name + ". 学号: " + this.studentid + ". 年龄: " + this.age + ". 专业: " + this.major; } } public class Student2 implements Comparable<Student2>{ private int studentid; private String name; private int age; private String major; public Student2(int studentid, String name, int age, String major) { super(); this.studentid = studentid; this.name = name; this.age = age; this.major = major; } // 三个返回结果都要写出来 public int compareTo(Student2 o) { if(this.studentid < o.studentid){ return -1; }else if(this.studentid > o.studentid){ return 1; }else { return 0; } } @Override public String toString(){ return "姓名: " + this.name + ". 学号: " + this.studentid + ". 年龄: " + this.age + ". 专业: " + this.major; } } public class App { public static void main(String[] args) { Student s1 = new Student(20223717, "龚涵彬", 20, "软件工程专业"); Student s2 = new Student(20223718, "李四", 19, "信息工程"); Student s3 = new Student(20223719, "王五", 20, "软件工程专业"); Student s4 = new Student(20223720, "赵六", 21, "软件工程专业"); Student s5 = new Student(20223721, "张三", 20, "信息工程"); Student s6 = new Student(20223722, "孙七", 19, "软件工程专业"); Student2 s7 = new Student2(20223723, "张雨轩", 20, "软件工程专业"); Student2 s8 = new Student2(20223724, "李四", 20, "信息工程"); Student2 s9 = new Student2(20223725, "王五", 19, "信息工程"); Student2 s10 = new Student2(20223726, "赵六", 21, "软件工程专业"); Student2 s11 = new Student2(20223727, "张三", 20, "网络工程"); Student2 s12 = new Student2(20223728, "孙七", 20, "计算机科学与技术"); List<Student> list = new ArrayList<Student>(); list.add(s1); list.add(s2); list.add(s3); list.add(s4); list.add(s5); list.add(s6); Collections.sort(list); System.out.println("按照学号从大到小输出: "); for(Student stu : list){ System.out.println(stu.toString()); } System.out.println("-----------------------------------------------------------------"); List<Student2> list2 = new ArrayList<Student2>(); list2.add(s7); list2.add(s8); list2.add(s9); list2.add(s10); list2.add(s11); list2.add(s12); Collections.sort(list2); System.out.println("按照学号从小到大输出: "); for(Student2 stu : list2){ System.out.println(stu.toString()); } } }