Java程序设计实验6 | 集合类

news2025/1/25 4:41:18

*本文是博主对Java各种实验的再整理与详解,除了代码部分和解析部分,一些题目还增加了拓展部分(⭐)。拓展部分不是实验报告中原有的内容,而是博主本人自己的补充,以方便大家额外学习、参考。

(解析部分还没加,过阵子补)

目录

一、实验目的

二、实验内容

1、将下列数据:“hello”、123、6.9、“hello”、“”、“Hello”、StringBuffer s=new StringBuffer(“hello”)中的s,添加到一个ArrayList对象中。

2、使用ArrayList集合,向集合中添加10个整数,并使用Iterator遍历该集合,并查找键盘输入的元素。

3、分别利用Arraylist和Set随机生成十个不重复的随机整数,随机整数范围为350到450。

4、集合中不容许有重复的对象,对于多个重复对象只能添加一次。例如在HashSet集合中添加三个Person对象,把姓名相同的人当做同一个人,虽然可以添加多次但集合里只保留一个,但是这对类的设计是有要求的,假设Person类中只包含name和age属性,则需要重写hashCode()方法和equals()方法,如果两个对象的name相同,则hashCode()方法的返回值相同,equals()方法返回true。

5、编写程序将一组学生对象的姓名和成绩存入到一个树集(TreeSet)中。

6、编写一个程序,读取个数不定的整数,然后查找其中出现频率最高的数字。要求通过键盘输入数据,当输入为0时,表示结束输入。如: 如果输入的数据是2   3   40   3   54   -3   3   3   2   0,那么数字3的出现频率是最高的。如果出现频率最高的数字不是一个而是多个,则应该将它们全部输出。例如当数据是9  30  3  9  3  2  4时,3和9都出现了两次,3和9都应该输出。

7、选择合适的Map集合保存5个用户的用户名和密码,然后将这些键值对打印出来。

8、(选做)统计字符串中每个单词出现的次数,使用HashMap来实现。例如:“Today, We have a class of java, as we kown, java is an object oriented  programming language, and java is fun! wish you enjoy it!”.

9、(选做)500个人围成一个圈,从1开始报数,数到3的倍数的人离开圈子,循环往复,直到最后圈子只剩下一人为止,求剩下的人原来在圈子的位置。

三、实验总结


一、实验目的

1、掌握容器类的层次结构;

2、掌握Collection接口和List接口的常用方法;

3、掌握Iterator接口的使用方式;

4、掌握Set接口和hashCode的使用方式;

5、掌握Map接口的使用方式。


二、实验内容

1、将下列数据:“hello”、123、6.9、“hello”、“”、“Hello”、StringBuffer s=new StringBuffer(“hello”)中的s,添加到一个ArrayList对象中。

• 将ArrayList中的所有元素打印输出。

• 查找元素“hello”。

• 删除指定的元素“hello”。

• 将元素123替换为1000。

源代码:

import java.util.ArrayList;

public class S6_1 {
    public static void main(String[] args) {
        // 创建ArrayList对象
        ArrayList<Object> list = new ArrayList<>();

        // 添加数据到ArrayList
        list.add("hello");
        list.add(123);
        list.add(6.9);
        list.add("hello");
        list.add("");
        list.add("Hello");
        StringBuffer s = new StringBuffer("hello");
        list.add(s);

        // 打印输出所有元素
        System.out.println("ArrayList中的所有元素为:");
        for (Object element : list) {
            System.out.print(element + ",");
        }

        System.out.println("\n========================");

        // 查找元素“hello”
        boolean found = list.contains("hello");
        if (found) {
            System.out.println("找到元素\"hello\"");
        } else {
            System.out.println("未找到元素\"hello\"");
        }

        System.out.println("\n========================");

        // 删除指定的元素“hello”
        list.remove("hello");
        System.out.println("删除元素\"hello\"后的ArrayList:");
        for (Object element : list) {
            System.out.println(element + ",");
        }

        System.out.println("\n========================");

        // 将元素123替换为1000
        int index123 = list.indexOf(123);
        if (index123 != -1) {
            list.set(index123, 1000);
            System.out.println("将元素123替换为1000后的ArrayList:");
            for (Object element : list) {
                System.out.println(element);
            }
        } else {
            System.out.println("未找到元素123");
        }
    }
}

列出测试数据和实验结果截图: 

2、使用ArrayList集合,向集合中添加10个整数,并使用Iterator遍历该集合,并查找键盘输入的元素。

提示:

• 使用add()方法将元素添加到ArrayList集合中。

• 调用集合的iterator()方法获得Iterator对象,并调用Iterator的hasNext()和next()方法,迭代出集合中的所有元素,完成查找功能,并将重复的元素删除。

源代码:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;

public class S6_2 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();

        // 1-向集合中添加10个随机整数
        for (int i = 0; i < 10; i++) {
            list.add(new Random().nextInt(10));
        }
        System.out.println(list);


        // 2-使用Iterator遍历集合并查找键盘输入的元素
        Iterator<Integer> iterator = list.iterator();
        Scanner reader = new Scanner(System.in);
        System.out.print("请输入要查找的整数:");
        int input = reader.nextInt();

        // 3-去重
        int count = 0;
        while (iterator.hasNext()) {
            int current = iterator.next();
            if (current == input) {
                count++;
                System.out.println("找到第" + count + "个元素 " + input);
                if(count > 1)
                    iterator.remove(); // 删除重复的元素
            }
        }

        // 打印删除重复元素后的集合
        System.out.println("删除重复元素后的ArrayList:");
        System.out.println(list);
    }
}

列出测试数据和实验结果截图:

3、分别利用Arraylist和Set随机生成十个不重复的随机整数,随机整数范围为350到450。

源代码:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class S6_3 {
    public static void main(String[] args) {
        // 使用 ArrayList 生成不重复的随机整数
        ArrayList<Integer> arrayList = generateRandomNumbersArrayList();
        System.out.println("ArrayList中的随机数:");
        System.out.println(arrayList);

        // 使用 Set 生成不重复的随机整数
        Set<Integer> set = generateRandomNumbersSet();
        System.out.println("Set中的随机数:");
        System.out.println(set);
    }

    // 生成 ArrayList 中的随机整数
    private static ArrayList<Integer> generateRandomNumbersArrayList() {
        ArrayList<Integer> arrayList = new ArrayList<>();
        Random random = new Random();

        while (arrayList.size() < 10) {
            int randomNumber = random.nextInt(101) + 350; // 生成350到450的随机数
            if (!arrayList.contains(randomNumber)) {
                arrayList.add(randomNumber);
            }
        }

        return arrayList;
    }

    // 生成 Set 中的随机整数
    private static Set<Integer> generateRandomNumbersSet() {
        Set<Integer> set = new HashSet<>();
        Random random = new Random();

        while (set.size() < 10) {
            int randomNumber = random.nextInt(101) + 350; // 生成350到450的随机数
            set.add(randomNumber);     //因为Set内置去重功能,故添加后无需判断
        }

        return set;
    }
}

列出测试数据和实验结果截图:

4、集合中不容许有重复的对象,对于多个重复对象只能添加一次。例如在HashSet集合中添加三个Person对象,把姓名相同的人当做同一个人,虽然可以添加多次但集合里只保留一个,但是这对类的设计是有要求的,假设Person类中只包含name和age属性,则需要重写hashCode()方法和equals()方法,如果两个对象的name相同,则hashCode()方法的返回值相同,equals()方法返回true。

源代码:

import java.util.HashSet;
import java.util.Objects;

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // Getters and setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    // 重写 hashCode 方法
    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

    // 重写 equals 方法
    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) {
            return false;
        }
        Person person = (Person) obj;
        return Objects.equals(name, person.name);
    }
}

public class S6_4 {
    public static void main(String[] args) {
        HashSet<Person> personSet = new HashSet<>();

        // 添加三个 Person 对象,其中两个 name 相同
        Person person1 = new Person("碳基肥宅", 25);
        Person person2 = new Person("热心网友wyd", 30);
        Person person3 = new Person("碳基肥宅", 28);

        personSet.add(person1);
        personSet.add(person2);
        personSet.add(person3);

        // 打印 HashSet 中的元素数量
        System.out.println("HashSet 中的元素数量:" + personSet.size());
        for (Person person : personSet) {
            System.out.println(person.getName() + " : " + person.getAge());
        }
    }
}

列出测试数据和实验结果截图:

5、编写程序将一组学生对象的姓名和成绩存入到一个树集(TreeSet)中。

完成以下要求:

• 使得按照成绩自动降序排列,并输出排序的结果。

源代码:

import java.util.Comparator;
import java.util.TreeSet;

// 学生类
class Student {
    private String name;
    private int score;

    public Student(String name, int score) {
        this.name = name;
        this.score = score;
    }

    // Getters
    public String getName() {
        return name;
    }

    public int getScore() {
        return score;
    }

    @Override
    public String toString() {
        return name + " : " + score;
    }
}

public class S6_5 {
    public static void main(String[] args) {
        // 创建 TreeSet 并指定降序排序的比较器
        TreeSet<Student> studentSet = new TreeSet<>(Comparator.comparingInt(Student::getScore).reversed());

        // 向 TreeSet 中添加学生对象
        studentSet.add(new Student("碳基肥宅", 85));
        studentSet.add(new Student("热心网友wyd", 75));
        studentSet.add(new Student("叮当同学", 92));
        studentSet.add(new Student("朵拉", 68));

        // 输出排序结果(按照成绩降序)
        System.out.println("按照成绩降序排列的学生信息:");
        for (Student student : studentSet) {
            System.out.println(student);
        }
    }
}

列出测试数据和实验结果截图:

6、编写一个程序,读取个数不定的整数,然后查找其中出现频率最高的数字。要求通过键盘输入数据,当输入为0时,表示结束输入。如: 如果输入的数据是2   3   40   3   54   -3   3   3   2   0,那么数字3的出现频率是最高的。如果出现频率最高的数字不是一个而是多个,则应该将它们全部输出。例如当数据是9  30  3  9  3  2  4时,3和9都出现了两次,3和9都应该输出。

提示:可以利用集合的元素不能重复这一特性。

源代码:

import java.util.*;


public class S6_6 {
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);

        Map<Integer, Integer> map = new HashMap<>();
        System.out.println("请输入整数(输入0结束输入):");
        int input;
        while ((input = reader.nextInt()) != 0) {
            map.put(input, map.getOrDefault(input, 0) + 1);
        }

        // 找出最大频率

        int maxFrequency = Collections.max(map.values());

        // 输出出现最大频率的数字
        System.out.println("出现频率最高的数字是:");
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if (entry.getValue() == maxFrequency) {
                System.out.print(entry.getKey());
            }
        }
    }
}

列出测试数据和实验结果截图:

也可以用PriorityQueue完成,感兴趣的朋友可以试试,具体的实现过阵子补在这里。

7、选择合适的Map集合保存5个用户的用户名和密码,然后将这些键值对打印出来。

源代码:

import java.util.HashMap;
import java.util.Map;

public class S6_7 {
    public static void main(String[] args) {
        // 创建一个 HashMap 来保存用户名和密码
        Map<String, String> userCredentials = new HashMap<>();

        // 添加用户的用户名和密码
        userCredentials.put("user1", "password1");
        userCredentials.put("user2", "password2");
        userCredentials.put("user3", "password3");
        userCredentials.put("user4", "password4");
        userCredentials.put("user5", "password5");

        // 打印用户名和密码的键值对
        System.out.println("用户名和密码的键值对:");
        for (Map.Entry<String, String> entry : userCredentials.entrySet()) {
            System.out.println("用户名: " + entry.getKey() + ", 密码: " + entry.getValue());
        }
    }
}

列出测试数据和实验结果截图:

8、(选做)统计字符串中每个单词出现的次数,使用HashMap来实现。例如:“Today, We have a class of java, as we kown, java is an object oriented  programming language, and java is fun! wish you enjoy it!”.

统计结果存储成以下形式:

a-->1

an-->1

and-->1

as-->1……

is-->2

提示:使用String.split(("[ \n\t\r.,;:!?()]")方法进行分词。

源代码:

import java.util.HashMap;
import java.util.Map;

public class S6_8 {
    public static void main(String[] args) {
        String text = "Today, We have a class of java, as we kown, java is an object oriented programming language, and java is fun! wish you enjoy it!";

        // 去除标点符号并分割字符串为单词
        String[] words = text.split("[ \n\t\r.,;:!?()]");

        // 创建 HashMap 来存储单词及其出现的次数
        Map<String, Integer> wordCount = new HashMap<>();

        // 统计单词出现的次数
        for (String word : words) {
            word = word.toLowerCase(); // 将单词转换为小写
            if (!word.isEmpty()) {
                wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
            }
        }

        // 打印每个单词及其出现的次数
        System.out.println("每个单词出现的次数:");
        for (Map.Entry<String, Integer> entry : wordCount.entrySet()) {
            System.out.println(entry.getKey() + "-->" + entry.getValue());
        }
    }
}

列出测试数据和实验结果截图:

9、(选做)500个人围成一个圈,从1开始报数,数到3的倍数的人离开圈子,循环往复,直到最后圈子只剩下一人为止,求剩下的人原来在圈子的位置。

提示:可以使用集合(ArrayList)或队列(Deque)实现。

源代码:

这个问题其实是著名的约瑟夫问题(Josephus problem),可以用递推的方式求解。

以下是使用队列(Deque)来模拟这个问题并求解最后剩下的人在原来圈子的位置:

import java.util.ArrayDeque;
import java.util.Deque;

public class S6_9 {
    public static void main(String[] args) {
        int totalPeople = 500;
        int count = 3;

        Deque<Integer> circle = new ArrayDeque<>();

        // 初始化圈子,编号从1到500
        for (int i = 1; i <= totalPeople; i++) {
            circle.addLast(i);
        }

        // 开始循环报数,直到圈子中只剩一个人为止
        while (circle.size() > 1) {
            for (int i = 0; i < count - 1; i++) {
                int person = circle.removeFirst();
                circle.addLast(person);
            }
            circle.removeFirst(); // 数到3的倍数的人离开圈子
        }

        // 打印最后剩下的人在原来圈子的位置
        System.out.println("最后剩下的人在原来圈子的位置是:" + circle.peek());
    }
}

列出测试数据和实验结果截图:


实验总结

在这个实验中我学到了很多关于集合类、循环和算法的知识,这些练习加深了我对集合、字符串处理和算法设计的理解。通过这些题目,我学会了:

  1. 掌握了ArrayList、HashSet、TreeSet、HashMap 等集合类的基本操作,包括添加、删除、遍历和使用键值对等。
  2. 学会了使用 split() 方法分割字符串,以及在字符串中搜索特定的内容。
  3. 理解了为了在集合中正确比较和存储自定义对象,需要重写 hashCode() 和 equals() 方法的重要性。
  4. 解决了一些经典问题,比如约瑟夫问题,提高了算法思维和编码能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1297657.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LeetCode算法题解(单调栈)|LeetCode503. 下一个更大元素 II、LeetCode42. 接雨水

一、LeetCode503. 下一个更大元素 II 题目链接&#xff1a;503. 下一个更大元素 II 题目描述&#xff1a; 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的…

【Web渗透】渗透测试简介

基本介绍 渗透测试(Penetration Testing)是一种通过模拟恶意攻击者的技术与手法对目标系统在可控制的范围内进行安全测试和安全评估的过程&#xff0c;其目的是在挖掘当前系统潜在的安全风险点后对系统进行安全升级来提升系统的安全性&#xff0c;并以此来规避被恶意攻击者入侵…

【C语言】操作符详解(二)

目录 移位操作符 左移操作符 右移操作符 位操作符:&、|、^、~ 一道面试题 移位操作符 <<左移操作符 >>右移操作符注:移位…

2023年【R2移动式压力容器充装】考试试卷及R2移动式压力容器充装实操考试视频

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 R2移动式压力容器充装考试试卷是安全生产模拟考试一点通生成的&#xff0c;R2移动式压力容器充装证模拟考试题库是根据R2移动式压力容器充装最新版教材汇编出R2移动式压力容器充装仿真模拟考试。2023年【R2移动式压力…

WGCLOUD v3.5.0 新增支持监测交换机的接口状态UP DOWN

WGCLOUD v3.5.0开始 可以监测交换机或SNMP设备的接口状态了&#xff0c;直接上图

浅析以太网接口及串口转以太网技术

浅析以太网接口 以太网相关接口主要包括&#xff1a;MII/RMII/SMII以及GMII/RGMII/SGMII接口。 一、MII接口 MII&#xff08;Media Independent Interface&#xff09;介质无关接口或称为媒体独立接口&#xff0c;它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口和…

《安富莱嵌入式周报》第328期:自主微型机器人,火星探测器发射前失误故障分析,微软推出12周24期免费AI课程,炫酷3D LED点阵设计,MDK5.39发布

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 更新一期视频教程&#xff1a; 【实战技能】 单步运行源码分析&#xff0c;一期视频整明白FreeRTOS内核源码框架和运行…

使用 iperf 和 iftop 测试网络带宽

博主历时三年精心创作的《大数据平台架构与原型实现&#xff1a;数据中台建设实战》一书现已由知名IT图书品牌电子工业出版社博文视点出版发行&#xff0c;点击《重磅推荐&#xff1a;建大数据平台太难了&#xff01;给我发个工程原型吧&#xff01;》了解图书详情&#xff0c;…

C# WPF上位机开发(串口界面设计)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果只是把上位机看成是纯软件开发&#xff0c;本身不和硬件打交道的话&#xff0c;那么这就把上位机的操作范围给限定死了。事实上&#xff0c;上…

Java基础-JDK的组成

目录 1. JDK的组成2.Java的跨平台、工作原理 1. JDK的组成 JVM&#xff1a;Java虚拟机&#xff0c;真正运行Java程序的地方核心类库&#xff1a;Java自己写好的程序&#xff0c;给程序员自己的程序调用的JRE&#xff1a;Java的运行环境JDK&#xff1a;Java开发工具包 JDK是由J…

LinuxBasicsForHackers笔记 -- 文件系统和存储设备管理

设备目录/dev Linux 有一个特殊的目录&#xff0c;其中包含代表每个连接设备的文件&#xff1a;相应命名的 /dev 目录。 /dev中有很多设备列表。 特别令人感兴趣的是设备 sda1、sda2、sda3、sdb 和 sdb1&#xff0c;它们通常是硬盘驱动器及其分区以及 USB 闪存驱动器及其分区…

嵌入式设备OTA升级的大致过程!

OTA概述 大家好&#xff0c;我是一个软件升级包。这几天呢&#xff0c;我将会进行一次神奇的网络之旅&#xff0c;从开发者的电脑中&#xff0c;一直跑到终端嵌入式设备中。 大家都把我的这个旅游过程叫做 OTA&#xff0c;也就是在线升级。 那么啥叫 OTA 呢&#xff1f;全称…

如何用Qt配置git项目并上传Gitee

1.进入到Qt项目文件夹内&#xff0c;打开 “Git Bash Here” 2.初始化&#xff0c;在“Git Bash Here”中输入 git init 3.加入所有文件&#xff0c;在“Git Bash Here”中输入 git add . (需要注意&#xff0c;git add 后面还有一个点) 4.添加备注&#xff0c;git com…

KUKA机器人在编程时添加需要等待的输入信号的2种方法

KUKA机器人在编程时添加需要等待的输入信号的2种方法 第一种方法:手动输入法 如下图所示,选中某个程序后,点击下方的“打开”, 如下图所示,将光标定位到所需位置,然后按下左上角的“编辑”按钮,此时示教器上会弹出输入键盘, 如下图所示,在键盘上手动输入语句:wait fo…

linux下部署frp客户端服务端-内网穿透

简介 部署在公司内部局域网虚拟机上的服务需要在外网能够访问到&#xff0c;这不就是内网穿透的需求吗&#xff0c;之前通过路由器实现过&#xff0c;现在公司这块路由器不具备这个功能了&#xff0c;目前市面上一些主流的内网穿透工具有&#xff1a;Ngrok&#xff0c;Natapp&…

西南科技大学C++程序设计实验十二(文件流操作)

一、实验目的 1. 熟悉文件的基本操作; 2. 在类中添加打开文件、保存文件、读取文件等处理函数; 二、实验任务 1. 分析完善程序:主函数创建一个文件对象,每次打开文件,在其尾部添加数据。如果文件不存在,则新建该文件。请将空白处需要完善的功能补充完整。 #include …

权威认证!景联文科技入选杭州市2023年第二批省级“专精特新”中小企业认定名单

为深入贯彻党中央国务院和省委省政府培育专精特新的决策部署&#xff0c;10月7日&#xff0c;杭州市经济和信息化委员会公示了2023年杭州“专精特新”企业名单&#xff08;第二批&#xff09;。 根据工业和信息化部《优质中小企业梯度培育管理暂行办法》&#xff08;工信部企业…

我的NPI项目之Android电源系列 -- 关于剩余充满时间的问题(一)

我的新项目是基于高通最新的5G平台&#xff0c;但是由于还没有拿到EVT。所以&#xff0c;就在目旧的平台和OS上进行学习。遇到第一个问题就是插上type-c之后&#xff0c;充满剩余时间异常的问题。 问题描述&#xff0c;在充电过程中&#xff0c;显示充满时间为“0 min left unt…

MSSQL 程序集使用方法

1.C# 写一个程序 1.1新建一个项目【类库【.Net FrameWork】 1.2编写代码 删除 namespace ApiSQLClass { } 代码如下&#xff1a;【具体调用API模式根据具体编写】 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.…

重写 AppiumService 类,添加默认启动参数,并实时显示启动日志

一、前置说明 在Appium的1.6.0版本中引入了AppiumService类&#xff0c;可以很方便的通过该类来管理Appium服务器的启动和停止。经过测试&#xff0c;使用该类的实例执行关闭server时&#xff0c;并没有释放端口号&#xff0c;会导致第二次启动时失败。另外&#xff0c;使用该…