前言:我在大一上学期学习了c语言,然后在下学期学习了第二门语言java,因为之前c语言学的挺一般的,然后在这学期学习java感觉还是挺不简单的,要自学很多东西,在这段时间里,我学习了JAVA的基本语法。逻辑结构的使用,学习了类的使用,和类的基本概念,学会了如何封装程序,使得代码更加严谨,代码也更加简洁,一看就懂,调用的类分别装了什么,使得整个代码更加简洁。

在学习Java的过程中,前期的⽐较基础的知识点掌握得都还不错,但对于后⾯的⾯向对象的编程语⾔的特性,⽐如继承,构造器,抽象类,接⼝,⽅法的多态,重载,覆盖,Java的异常处理机制等等还理解的不够透彻,需要花费更多的时间,才能够彻底把这些概念都搞清楚,把书上⾯的例⼦反复的揣摩,修改,尝试,才能彻底领悟。还有Java的类库。基础类库⾥⾯的类⾮常⾮常多。据说有3000多个。但是平时真正⾼频率使⽤的只有⼏个,⽐如说 java.io.; java.util.; java.sql.*;等

在这三次的大作业中主要困扰我的是第三次大作业的最后一题,不知道该如何去修改之前的代码,调试题目的测试点也很多,需要慢慢的花时间去调试,还要充分理解正则表达式,以及正确运用正则表达式。还有哈希表的

学习与应用都是这道题目的难点。

设计与分析:在第2次大作业的最后一题中主要是添加了删除内容。

(这是对应第2题的uml图)

如:

public void setAnswers(List answers) {

this.answers = answers;

}

public void setAnswersList(List answersList) {

this.answers = answersList;

}

public List getAnswersList() {

return answers;

}

public List getAnswers() {

return answers;

}

,创建了 answersList ,运用确定其范围,setAnswers(List answers) 方法接收一个 List 类型的参数 answers,然后将其赋值给类中的成员变量 answers。这个方法用于设置答案。

setAnswersList(List answersList) 方法也接收一个 List 类型的参数 answersList,然后将其赋值给类中的成员变量 answers。这个方法也用于设置答案。

getAnswersList() 方法用于获取答案,它返回类中的成员变量 answers,这个方法返回的是一个 List 类型的答案列表。

getAnswers() 方法也用于获取答案,同样返回类中的成员变量 answers,这个方法也返回一个 List 类型的答案列表。

while (scanner.hasNext()) {

String line = scanner.nextLine();

if (line.equals("end")) {

break;

}

        if (line.startsWith("#N:")) {
String[] parts = line.split(" ");
int number = Integer.parseInt(parts[0].split(":")[1]);
String content = parts[1].split(":")[1];
String answer = parts[2].split(":")[1];
questionMap.put(number, new Question(number, content, answer));
} else if (line.startsWith("#T:")) {
String[] parts = line.split(" ");
int paperNumber = Integer.parseInt(parts[0].split(":")[1]);
TestPaper testPaper = new TestPaper(paperNumber);
for (int i = 1; i < parts.length; i++) {
String[] qInfo = parts[i].split("-");
testPaper.addQuestionScore(Integer.parseInt(qInfo[0]), Integer.parseInt(qInfo[1]));
}
testPaperMap.put(paperNumber, testPaper);
} else if (line.startsWith("#S:")) {
String[] parts = line.split(" ");
int paperNumber = Integer.parseInt(parts[0].split(":")[1]);
AnswerSheet answerSheet = new AnswerSheet(paperNumber);
for (int i = 1; i < parts.length; i++) {
answerSheet.addAnswer(parts[i].split(":")[1]);
}
answerSheets.add(answerSheet);
}
}

while (scanner.hasNext()) {:这是一个while循环,条件是检查输入是否还有下一行数据。scanner是一个扫描器对象,用于从输入流中读取数据。

String line = scanner.nextLine();:从输入流中读取下一行数据,并将其存储在字符串变量line中。

if (line.equals("end")) { break; }:如果当前行是"end",则退出循环,停止读取输入。这个条件检查确保循环在遇到"end"时结束,防止继续读取无关的数据。

接下来是一系列if-else语句,用于根据不同的行格式解析数据:

如果当前行以#N:开头,则表示这是一个题目信息。程序将该行按空格分割,并解析题目编号、内容和答案,然后将这些信息存储在questionMap中。

如果当前行以#T:开头,则表示这是一个考卷信息。程序将该行按空格分割,并解析考卷编号和各题的得分信息,然后将这些信息存储在testPaperMap中。

如果当前行以#S:开头,则表示这是一个答题卡信息。程序将该行按空格分割,并解析答题卡编号和各题的答案,然后将这些信息存储在answerSheets列表中。

循环结束条件是遇到了"end"行,此时会退出循环。

踩坑心得:我的第2次大作业

for (int i = 1; i <= answerSheet.getAnswers().size(); i++) {

            if (question != null) {
totalScore += question.getAnswer().equals(answerSheet.getAnswerForQuestion(i)) ? testPaper.getScoreForQuestion(i) : 0;
}
}
System.out.println(totalScore + " " + testPaper.getTotalScore() + "~" + totalScore); }

看似没有什么问题,但哈希表确定的范围有问题,修改后加上了 Question question = questionMap.get(i);

在后续两个作业集中思路是大概一致的但是多了学号,试卷,答卷的输入与输出,和删除题目的功能。

来分别获取学号,答卷的信息,要重新设计正则表达式来匹配对应的字符串输入。然后分别进行处理把数据存入哈希表。

改进建议:这段代码已经相当不错了,但是还有一些改进的地方可以考虑:

异常处理:在解析整数时,应该考虑到可能抛出NumberFormatException异常。可以在解析整数的地方添加异常处理机制,以处理非法输入的情况。

try {

int number = Integer.parseInt(parts[0].split("[1]);

// 其他代码...

} catch (NumberFormatException e) {

// 处理异常的代码,例如打印错误信息或者跳过当前行

}

Copy

代码重构:可以考虑将相似的代码抽取成方法,以提高代码的可读性和复用性。例如,解析行的逻辑可以抽取成一个方法,以减少重复代码。

private void parseLine(String line) {

// 解析行的逻辑...

}

// 在循环中调用该方法

parseLine(line);

Copy

数据结构选择:根据实际需求和数据量的大小,可以考虑选择更适合的数据结构来存储题目、考卷和答题卡信息。例如,如果需要频繁根据题目编号来查找题目信息,则可以选择使用HashMap来存储题目信息。

代码注释:尽可能添加清晰的注释,以解释代码的功能、作用和实现细节,有助于他人理解和维护代码。

单一职责原则:确保每个方法和类只负责一个明确的功能,遵循单一职责原则有助于代码的可维护性和扩展性。

错误处理和边界情况:在解析数据和操作数据时,应该考虑到各种可能的错误情况和边界情况,并进行相应的处理和验证,以增强代码的健壮性。

总结:Java学起来很有趣,通过学习Java可以提⾼⾃⼰的逻辑能⼒。在学习Java期间做了⼀些程序,完成的还不错!在做程序时,我遇到了⼀些难题,有时会因为出现的错误长时间不能得到解决弄得我⼼烦意乱,但是我知道只有坚持下去才会成功。因为Java是⼀种⾯向对象的编程语⾔,刚开始会感觉⽐较抽象,⼀些概念知识需要慢慢去理解,多做练习,熟能⽣巧,只有多练了,才能在写项⽬时很熟练的写出你想要代码。平⽇在练习时若遇到不会的题⽬或是在项⽬中遇到解诀不了的问题,⾸先不要急着去问⽼师,或是急着上百度搜答案,那样即使你得到了正确答案,以后在其它地⽅遇到同样的问题,你还是不知道怎么解决!所以说,在遇到问题时,⾃⼰先想想要怎么解决,如果⾃⼰想不出什么好⽅法的话,也可以向同学请教请教,三⼈⾏必有我师,你不懂的地⽅其他同学可能知道。如果还是没能解决,那只有问⽼师或是上⽹搜索查找相应的解决⽅法了。好好理解其解决思路。

第一次blog的更多相关文章

  1. JAVA第一次blog总结

    JAVA第一次blog总结 0.前言 大一下学期我们开展了OPP这门课程,这也是我们第一次接触到JAVA.与上学期我们在学校里学C语言不同的是,这学期由于疫情原因我们是以网课的方式在学习.在学习中我发 ...

  2. 南昌航空大学-软件学院-22206104-段清如-JAVA第一次Blog作业

    南昌航空大学-软件学院-22206104-段清如-JAVA第一次Blog作业 前言: 这个学期才开始接触java,到现在一个多月的时间,已经差不多可以写出一些基本的简单的程序了.对比上个学期学习的C语 ...

  3. OO第一次blog

    (1)基于度量来分析自己的程序结构 第一次:Poly:属性 AL<Term>方法 check(格式检查) Poly(构造) merge(合并) compute(求导) Term:属性 co ...

  4. 面向对象程序设计A第一次blog

    一.前言 第一次题目集总结-- 题量:较多 难度:较低 知识点: 简单的输入输出 一些简单的运算和类型转换 一些简单的循环.选择.字符串.数组的使用 总结:题目比较简单,题量较多,内容就是一些简单的输 ...

  5. 第三阶段Blog

    题目集7~9的总结性Blog 1.前言 一个月又过去了,又到了写blog的时候,相较于前两次Blog,这一次所要分析的内容从原先的侧重于类设计到了这次的侧重于结构设计.在完成作业的时候,尽管题目内提供 ...

  6. 第一次OOP作业-Blog总结

    前言 第一次作业一共八道题,此次作业也是这三次作业中最接近面向过程程序设计的题目集,整体难度偏低,总耗时1.5h,主要的知识点在熟悉Java的语法上,整体题目的逻辑非常清晰简单,但最后一个判断三角形类 ...

  7. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  8. django创建blog

    如果本文看不懂的,去看的我视频吧!http://www.testpub.cn/ ------------------------------------------- Django 自称是" ...

  9. django 快速搭建blog

    如果本文看不懂的,去看的我视频吧!http://www.testpub.cn/ ------------------------------------------- Django 自称是“最适合开发 ...

  10. 《C和指针(Pointer on c)》 学习笔记(转自:http://dsqiu.iteye.com/blog/1687944)

    首先本文是对参考中三个连接的博客进行的整理,非常感谢三位博主的努力,每次都感叹网友的力量实在太强大了…… 第一章 快速上手 1.  在C语言中用/*和*/来注释掉这段代码,这个实际上并不是十分的安全, ...

随机推荐

  1. 【easy52pojie】一款方便看吾爱论坛帖子的爬虫程序

    众所周知吾爱论坛一页最多显示十来条回帖,且间隔很大,每页的信息密度太低了.在帖子很庞大的情况下,一页一页翻页,着实有点痛苦. 故简单敲敲代码,使用request xpath技术做了一个论坛帖子回复查看 ...

  2. [置顶] java动态控制线程的启动和停止

    最近项目有这样的需求:原来系统有个计算的功能,但该功能执行时间会很长(大概需要几个小时才能完成),如果执行过程中出现了错误的话,也只能默默的等待错误执行完成才行,无法做到动态的对该功能进行停止. 我了 ...

  3. 【Unity 3D游戏开发】在Unity使用NoSQL数据库方法介绍

    随着游戏体积和功能的不断叠加,游戏中的数据也变得越来越庞杂,这其中既包括玩家产生的游戏存档等数据,例如关卡数.金币等,也包括游戏配置数据,例如每一关的配置情况.尽管Unity提供了PlayerPref ...

  4. npm ERR! code ENOENT npm ERR! syscall open npm ERR! path C:\Users\shuzi\Desktop\保密文件项目\test-ui/package.json npm ERR! errno -4058

    打开一个新的项目,因为当前项目文件夹下没有npm,"dev": "npm run start:dev",所以所以没有展示对应的运行图,如下图: 打开一个新的前端 ...

  5. 记录--用了那么久的Vue,你了解Vue的报错机制吗?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助   Vue的5种处理Vue异常的方法 相信大家对Vue都不陌生.在使用Vue的时候也会遇到报错,也会使用浏览器的F12 来查看报错信息.但 ...

  6. dotNet符号文件(pdb),符号包(snupkg)和SourceLink

    前言 本文的主题是 Visual Studio 调试 NuGet 包,以及符号包的概念,如何去发布一个 NuGet 包,让我们的 NuGet 包支持 SouceLink,这些都是我们开发中比较容易忽视 ...

  7. 立创EDA的使用

    立创EDA的使用 1.实验原理 最近在使用立创EDA来做电路作业,这里记录一下立创EDA的基本操作,以后小型的电路设计可以在其主页完成.立创EDA是一个可以线上完成电路设计仿真以及布线的免费设计工具, ...

  8. kubeadm init cannot find network namespace 错误

    使用 kubeadm 安装好 weave 网络插件之后,查看 kubelet 输出信息发现如下错误: 4月 25 13:51:48 k8s-master kubelet[1232730]: I0425 ...

  9. python爬虫反爬之快速配置免费IP代理池(ProxyPool)

    关注我的公众号[靠谱杨阅读人生]回复ProxyPool可以免费获取网盘链接. 也可自行搜索下载:https://github.com/Python3WebSpider/ProxyPool.git 1. ...

  10. 论文阅读小结(B/S和C/S结构)

    论文阅读小结 一.B/S 和 C/S 软件体系结构选择 1) C/S . B/S 结构概述 C/S 结构,即 Client/Server (客户机 / 服务器 ), C/S 结构软件分为客户机和服务器 ...