实验四 常用类和集合框架

完成作业罢了。

一、目的与任务

理解并掌握String类、StringBuffer类;掌握字符串与其他数据类型的转换掌握Math类的使用;了解和掌握集合框架;掌握Java Application命令行参数的使用。

二、内容、要求与安排方式

(1)编写程序,当以年-月-日的格式输入一个日期时,输出该年是否为闰年,该月有几天,该日是星期几。
(2)设计一个Student类,该类中包括学生的姓名和成绩。创建Student类的5个对象,如下所示:
姓名 成绩
刘德华 90
张学友 80
刘杰 65
章子怡 100
周迅 60
将以上5个对象放入LinkedList中,完成如下操作和统计:

  • 输出LinkedList中的对象个数。
  • 删除姓名为“刘杰”的学生信息,并输出LinkedList中现有学生信息。
  • 将姓名为“刘德华”的学生成绩改为95。
  • 输出成绩不及格的学生姓名。

(3)现有以下三个email地址”zhangsan@sohu.com”、”lisi@163.com”、”wangwu@sina.com”。需要把email中的用户部分和邮件地址部分分离(即将@前后部分分离),分离后以键值对应的方式存入HashMap中,并遍历输出。
(4)现有一段文本如下:“I/have/a/dream/今天/天气/晴朗/万里/无云/I/have/a/good/idea/今天/天气/不错”。试用HashMap实现对文本中出现的单词词频进行统计,并对统计结果进行输出显示,如“I:2”,表示单词“I”在文本中出现了两次。

第(1)题

(1)编写程序,当以年-月-日的格式输入一个日期时,输出该年是否为闰年,该月有几天,该日是星期几。

//这些行引入了程序所需的库,包括SimpleDateFormat(用于日期格式化)、Date(日期对象)和Calendar(日期操作)。
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Calendar;
import java.util.Scanner;

public class DateInfo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请以年-月-日的格式输入日期,例如:2023-10-31");
String inputDate = scanner.nextLine();

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
try
{
Date date = dateFormat.parse(inputDate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // 月份从0开始,需要加1
int day = calendar.get(Calendar.DAY_OF_MONTH);

// 判断是否为闰年
boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);

// 获取该月的天数
int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

// 获取该日是星期几
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

String[] dayOfWeekNames = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
String dayOfWeekName = dayOfWeekNames[dayOfWeek - 1];

System.out.println(year + "年是否为闰年: " + (isLeapYear ? "是" : "不是"));
System.out.println(month + "月有 " + daysInMonth + " 天");
System.out.println(inputDate + " 是 " + dayOfWeekName);
} catch (Exception e) {
System.out.println("日期格式无效,请使用 yyyy-MM-dd 格式");
e.printStackTrace();
}
}
}

概括程序

它接受用户输入的日期,然后根据输入的日期执行以下操作:

1.判断输入的年份是否为闰年。
2.获取输入月份的天数。
3.确定输入的日期是星期几。
此外,程序还包括了异常处理,以便在用户提供无效日期格式时提供错误消息。以下是对程序的概括:

* 使用 Scanner 从用户输入中获取日期。
* 使用 SimpleDateFormat 解析用户输入的日期。
* 使用 Calendar 类获取日期的年份、月份、日期等信息。

根据计算,判断年份是否为闰年。
使用 getActualMaximum 方法获取月份的天数。
使用数组来存储星期的名称,然后根据计算的星期值找到相应的名称。
输出结果,包括年份是否为闰年、月份的天数和输入日期的星期。
这个程序是一个很好的示例,展示了如何使用Java处理日期和用户输入,以及如何实施异常处理来提高程序的健壮性。

java库是什么,怎么知道该用哪个库?

Java库(Java libraries)是Java编程语言提供的预定义类和方法的集合,用于执行各种任务和操作。这些库被设计为通用工具,以便开发者可以轻松地处理常见任务,而无需从头开始编写所有代码。Java库包括了各种用途的类和方法,例如日期处理、文件操作、网络通信、图形界面、数据结构、数据库连接等。

在Java编程中,您可以通过导入库中的类来使用库中的功能。以下是一些常见的Java库和用途:

java.util: 提供了用于数据结构(如集合、列表、队列、堆栈)、日期和时间处理的类。
java.io: 用于文件输入输出的类,允许您读取和写入文件。
java.net: 用于网络通信的类,包括Socket、URL等,可用于创建网络应用程序。
java.awt和javax.swing: 用于创建图形用户界面(GUI)的类和组件。
java.sql: 用于数据库连接和执行SQL查询的类。
java.lang: 包含Java的基本类,如String、Object、Math等,这些类无需显式导入,可以直接使用。
java.nio: 提供了新I/O系统,用于高性能的文件和网络I/O操作。
java.util.concurrent: 用于并发编程的类,如线程池、锁等。

根据您的任务和需求,选择合适的库来简化编程工作。通常,可以在Java文档中找到每个库和类的详细信息,以帮助了解它们的功能和用法。同时,IDE(如IntelliJ IDEA)通常会提供自动导入库的功能,以简化库的使用。
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

这一行创建了一个 SimpleDateFormat 对象,用于将输入的日期字符串解析为日期对象。”yyyy-MM-dd” 是日期格式的模式,它表示年-月-日的格式。

try {
Date date = dateFormat.parse(inputDate);

在 try 块中,程序尝试将输入的日期字符串解析为 Date 对象。

Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

这里创建了一个 Calendar 对象,用于执行日期操作。calendar.setTime(date) 设置日历对象的日期为解析后的日期对象。

int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH) + 1; // 月份从0开始,需要加1
int day = calendar.get(Calendar.DAY_OF_MONTH);

这些代码行从 Calendar 对象中提取年、月和日的信息。

boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);

这一行判断输入的年份是否为闰年。它根据闰年的规则进行判断,如果符合规则,则 isLeapYear 变量为 true,否则为 false。

int daysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

这一行获取了输入日期所在月份的天数。

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

这一行获取了输入日期是星期几,其中星期日是1,星期一是2,以此类推。

String[] dayOfWeekNames = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
String dayOfWeekName = dayOfWeekNames[dayOfWeek - 1];

这些代码用于将星期数字转换为星期的文本名称,例如将数字1转换为”星期日”。
最后,程序将结果输出到控制台,包括年份是否为闰年、月份的天数和输入日期的星期。

第(2)题

(2)设计一个Student类,该类中包括学生的姓名和成绩。创建Student类的5个对象,如下所示:
姓名 成绩
刘德华 90
张学友 80
刘杰 65
章子怡 100
周迅 60
将以上5个对象放入LinkedList中,完成如下操作和统计:

  • 输出LinkedList中的对象个数。
  • 删除姓名为“刘杰”的学生信息,并输出LinkedList中现有学生信息。
  • 将姓名为“刘德华”的学生成绩改为95。
  • 输出成绩不及格的学生姓名。
class Student {
private final String name;
private int score;

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

public String getName() {
return name;
}

public int getScore() {
return score;
}

public void setScore(int score) {
this.score = score;
}
}
import java.util.LinkedList;
import java.util.List;
import java.util.Iterator;

public class StudentManagement {
public static void main(String[] args) {
// 创建一个LinkedList并添加5个Student对象
LinkedList<Student> studentList = new LinkedList<Student>();
studentList.add(new Student("刘德华", 90));
studentList.add(new Student("张学友", 80));
studentList.add(new Student("刘杰", 65));
studentList.add(new Student("章子怡", 100));
studentList.add(new Student("周迅", 60));

// 输出LinkedList中的对象个数
System.out.println("LinkedList中的对象个数: " + studentList.size());

// 删除姓名为“刘杰”的学生信息
Iterator<Student> iterator = studentList.iterator();
while (iterator.hasNext()) {
Student student = iterator.next();
if (student.getName().equals("刘杰")) {
iterator.remove();
}
}

// 输出LinkedList中现有学生信息
System.out.println("删除“刘杰”后的学生信息:");
for (Student student : studentList) {
System.out.println("姓名: " + student.getName() + ", 成绩: " + student.getScore());
}

// 将姓名为“刘德华”的学生成绩改为95
for (Student student : studentList) {
if (student.getName().equals("刘德华")) {
student.setScore(95);
}
}

// 输出成绩不及格的学生姓名
System.out.println("成绩不及格的学生姓名:");
for (Student student : studentList) {
if (student.getScore() < 60) {
System.out.println("姓名: " + student.getName());
}
}
}
}

第(3)题

(3)现有以下三个email地址”zhangsan@sohu.com”、”lisi@163.com”、”wangwu@sina.com”。需要把email中的用户部分和邮件地址部分分离(即将@前后部分分离),分离后以键值对应的方式存入HashMap中,并遍历输出。

/**
* @BelongsProject: Lab_4
* @BelongsPackage: EmailParser
* @Author Shiel
* @CreateTime 2023/10/31 13:56
* @Version 1.0
*/
import java.util.HashMap;

public class EmailParser {
public static void main(String[] args) {
// 创建一个HashMap来存储email地址的用户部分和邮件地址部分
HashMap<String, String> emailMap = new HashMap<String, String>();

// 添加email地址到HashMap
emailMap.put("zhangsan@sohu.com", "用户部分: zhangsan, 邮件地址部分: sohu.com");
emailMap.put("lisi@163.com", "用户部分: lisi, 邮件地址部分: 163.com");
emailMap.put("wangwu@sina.com", "用户部分: wangwu, 邮件地址部分: sina.com");

// 遍历HashMap并输出结果
for (String email : emailMap.keySet()) {
String value = emailMap.get(email);
System.out.println(email + " -> " + value);
}
}
}

第(4)题

(4)现有一段文本如下:“I/have/a/dream/今天/天气/晴朗/万里/无云/I/have/a/good/idea/今天/天气/不错”。试用HashMap实现对文本中出现的单词词频进行统计,并对统计结果进行输出显示,如“I:2”,表示单词“I”在文本中出现了两次。

/**
* @BelongsProject: Lab_4
* @BelongsPackage: WordFrequency
* @Author Shiel
* @CreateTime 2023/10/31 13:57
* @Version 1.0
*/
import java.util.HashMap;

public class WordFrequency {
public static void main(String[] args) {
String text = "I/have/a/dream/今天/天气/晴朗/万里/无云/I/have/a/good/idea/今天/天气/不错";
String[] words = text.split("/"); // 使用斜杠分割文本

HashMap<String, Integer> wordFrequencyMap = new HashMap<String, Integer>();

for (String word : words) {
// 如果单词已经在HashMap中存在,增加词频;否则,将词频设置为1
if (wordFrequencyMap.containsKey(word)) {
wordFrequencyMap.put(word, wordFrequencyMap.get(word) + 1);
} else {
wordFrequencyMap.put(word, 1);
}
}

// 遍历HashMap并输出统计结果
for (String word : wordFrequencyMap.keySet()) {
int frequency = wordFrequencyMap.get(word);
System.out.println(word + ":" + frequency);
}
}
}