软件设计十八

 

实验18:迭代器模式

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

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

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

 
   

 


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

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

实验要求:

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

1. List 接口

组成特点

- **有序**,元素可以重复。

- 实现类:`ArrayList`、`LinkedList`、`Vector`。

 

常用方法

- `add(E e)`:添加元素。

- `get(int index)`:按索引获取元素。

- `remove(int index)`:按索引删除元素。

- `size()`:获取元素个数。

- `contains(Object o)`:检查是否包含某元素。

 

---

 

2. Set 接口

组成特点

- **无序**,元素**不重复**。

- 实现类:`HashSet`、`TreeSet`、`LinkedHashSet`。

 

常用方法

- `add(E e)`:添加元素。

- `remove(Object o)`:删除元素。

- `contains(Object o)`:检查是否包含某元素。

- `size()`:获取元素个数。

- `isEmpty()`:检查是否为空。

 

---

 

3. Map 接口

组成特点

- 键值对存储,**键唯一**,值可重复。

- 实现类:`HashMap`、`TreeMap`、`LinkedHashMap`、`Hashtable`。

 

常用方法

- `put(K key, V value)`:添加键值对。

- `get(Object key)`:根据键获取值。

- `remove(Object key)`:删除键值对。

- `containsKey(Object key)`:检查是否包含键。

- `containsValue(Object value)`:检查是否包含值。

- `keySet()`:返回所有键。

- `values()`:返回所有值。

 

---

 

4. Vector

组成特点

- 动态数组,**线程安全**。

- 属于 `List` 的一种实现。

 

常用方法

- `add(E e)`:添加元素。

- `remove(int index)`:按索引删除元素。

- `get(int index)`:获取元素。

- `size()`:获取元素个数。

- `capacity()`:返回当前容量。

 

---

 

 5. Stack

组成特点

- 基于 `Vector` 实现的 **后进先出(LIFO)** 数据结构。

 

常用方法

- `push(E e)`:元素入栈。

- `pop()`:元素出栈。

- `peek()`:查看栈顶元素。

- `isEmpty()`:检查是否为空。

 

 

6. Queue 接口

组成特点

- **先进先出(FIFO)** 数据结构。

- 实现类:`LinkedList`、`PriorityQueue`。

 

常用方法

- `offer(E e)`:入队。

- `poll()`:出队,返回并移除队首元素。

- `peek()`:查看队首元素。

- `isEmpty()`:检查是否为空。

- `size()`:获取元素个数。

 

2.  提交源代码;

//Student.java

public class Student{

    private String id;

    private String name;

    private String age;

    public String getAge() {

        return age;

    }

    public void setAge(String age) {

        this.age = age;

    }

    public Student(){}

    public Student(String id,String name,String age){

        this.id = id;

        this.name = name;

        this.age = age;

    }

    public String getId() {

        return id;

    }

    public void setId(String id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String toString() {

        return "学号=" + id + ", 名字=" + name + ", 年龄=" + age;

    }

 

    public static Student fromString(String s){

        String[] split = s.split(";");

        if(split.length==3){

            return new Student(split[0],split[1],split[2]);

        }else{

            throw new RuntimeException("不能从字符串‘"+s+"’解析出"+Student.class+"类型的对象!");

        }

    }

}

 

//Iterators.java

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;


public class Iterators {

    public static void main(String[] args) {
        InputStream is = Iterators.class.getClassLoader().getResourceAsStream("student_info.txt");
        List<Student> list = getStudents(is);

        System.out.println("学号从小到大:");
        Iterator<Student> iterator = list.iterator();
        while(iterator.hasNext()){
            Student student = iterator.next();
            System.out.println(student);
        }
        System.out.println("学号从大到小:");
        ListIterator<Student> li=list.listIterator();
        for(li=list.listIterator();li.hasNext();) {
            li.next();
        }
        for(;li.hasPrevious();) {
            Student student = li.previous();
            System.out.println(student);
        }
    }

    private static List<Student> getStudents(InputStream is){
        List<Student> list = new LinkedList<>();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        String temp = null;
        try {
            while((temp=reader.readLine())!=null){
                Student student = Student.fromString(temp);
                list.add(student);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
}

3.     运行结果

 

 

 

 

 

 

posted @ 2024-11-20 20:19  连师傅只会helloword  阅读(6)  评论(0)    收藏  举报