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());
        }
    }
}

 

posted @ 2024-11-23 20:00  伐木工熊大  阅读(9)  评论(0)    收藏  举报