122
社区成员




这个作业属于哪个课程 | 班级的链接 |
---|---|
这个作业要求在哪里 | 软件工程实践第二次作业—文件读取 |
这个作业的目标 | 完成对澳大利亚网球公开赛相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序 |
其他参考文献 | 无 |
https://gitcode.net/m0_72507766/project-java
阶段 | 描述 | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 10 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | 600 | 500 |
Analysis | 需求分析(包括学习新技术) | 120 | 100 |
Design Spec | 生成设计文档 | 20 | 50 |
Design Review | 设计复审 | 60 | 60 |
Coding Standard | 代码规范 | 20 | 30 |
Design | 具体设计 | 120 | 60 |
Coding | 具体编码 | 360 | 450 |
Code Review | 代码复审 | 30 | 75 |
Test | 测试(自我测试,修改代码,提交修改) | 120 | 120 |
Reporting | 报告 | 60 | 40 |
Test Report | 测试报告 | 80 | 60 |
Size Measurement | 计算工作量 | 60 | 20 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 60 | 60 |
合计 | 1670 | 1645 |
数据是从助教的data中获取,这里就不详细说明。当我们看到数据是json文件时,我们可以去分析它的具体结构,如下:
由上述分析可知,需要先导入阿里巴巴的gron解析包(fastjson出了点问题所以改用谷歌的),调用gron的jsonObject与jsonArray去解析对应数据
DWASearch类中由args[0],args[1]从命令行读取input,output,并调用Lib类的judge方法向其传递数据
Lib类可以用hashmap来存储json路径的映射关系,并用judge()判断,根据判断结果调用Core的outputathlete()和outputolayer()。
public class DWASearch {
public static void main(String[] args) {
Lib lib=new Lib();
List<String>commands =Lib.readinput(args[0]);
lib.judge(commands,args[1]);
}
}
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
class Core {
public static void outputAthletesInfo(String filename) {
try {
FileOutputStream fos = new FileOutputStream(filename, true);
JsonArray jsonArray = parseJsonString(readJsonFile("data/athletes.json")).getAsJsonArray();
// 一层一层拨开数据
for (int i = 0; i < jsonArray.size(); i++) {
JsonObject jsonObject = jsonArray.get(i).getAsJsonObject();
String countryName = jsonObject.get("CountryName").getAsString();
JsonArray participations = jsonObject.get("Participations").getAsJsonArray();
for (int j = 0; j < participations.size(); j++) {
JsonObject participation = participations.get(j).getAsJsonObject();
String fullName = participation.get("PreferredLastName").getAsString() + " " + participation.get("PreferredFirstName").getAsString();
fos.write(("FullName:" + fullName + "\r\n").getBytes());
String gender = (participation.get("Gender").getAsInt() == 0 ? "Male" : "Female");
fos.write(("Gender:" + gender + "\r\n").getBytes());
fos.write(("Country:" + countryName + "\r\n").getBytes());
fos.write(("-----" + "\r\n").getBytes());
}
}
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//篇幅原因只展示部分
////
////
public static JsonObject parseJsonString(String jsonString) {
JsonParser parser = new JsonParser();
return parser.parse(jsonString).getAsJsonObject();
}
//解析JSON字符串并返回JsonObject对象
}
程序性能优化主要在于IO的重复操作,一方面可以使用BufferedReader加快读取
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuilder buffer = new StringBuilder();
String line = "";
while ((line = in.readLine()) != null) {
buffer.append(line);
}
另一方面可以避免重复读入,即已读过的不再读取,通过Hashmap映射json路径加快遍历
public static String getjsonpath(String input) {
Set<Map.Entry<String, String>> entries = command.entrySet();
for (Map.Entry<String, String> entry : entries) {
if (entry.getKey().equals(input)) {
return entry.getValue();
}
}
return null;
}
//将HashMap中的每个键值对封装成一个Map.Entry对象,并将这些对象存储在一个Set集合中,方便对HashMap中的键值对进行遍历和操作。
测试采用java的Juit进行测试,在对应函数上写入@Test注释
public class DWASearchTest {
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() throws Exception {
}
@Test
//参数个数测试
public void Test1(){
DWASearch.main(new String[]{"C:\\Users\\wuweijie\\Desktop\\新建文件夹\\project-java\\052101407\\src\\input"});//参数个数错误
}
@Test
public void Test2(){
DWASearch.main(new String[]{"C:\\Users\\wuweijie\\Desktop\\新建文件夹\\project-java\\052101407\\src\\input","C:\\Users\\wuweijie\\Desktop\\新建文件夹\\project-java\\052101407\\src\\output"});//参数正确
}
@Test
public void Test3() {
DWASearch.main(new String[]{"C:\\Users\\youngz\\Desktop\\FINAL\\src\\input", "C:\\Users\\youngz\\Desktop\\FINAL\\src\\output", "output.txt"});//参数个数错误
}
//参数格式测试
@Test
public void Test4() {
DWASearch.main(new String[]{"input", "output"});
}
@Test
public void Test5() {
DWASearch.main(new String[]{"input.txt", "output"});
}
@Test
public void Test6() {
DWASearch.main(new String[]{"input", "output.txt"});//格式错误
}
@Test
public void Test7() {
DWASearch.main(new String[]{"1.txt", "2.txt"});//格式错误
}
@Test
public void Test8() {
DWASearch.main(new String[]{"input.txt", "output.txt"});//格式错误
}
}
主要用到thorw和try catch处理IOexcepttion
终于完成辣,感谢同学和助教的帮助,整个流程下来,我时常出问题,甚至IDEA也是刚刚开始着手使用(之前用vscode,用不清楚还是),过程中不止遇到了code的问题,idea导入jar,maven等配置也是搞得一头雾水,但我还是学到了很多,jsonArray和jsonobject等配合Java的使用让我学到了不少,希望接下来的任务我也能以一颗积极的状态去面对,菜就要多练!