688
社区成员
发帖
与我相关
我的任务
分享| 这个作业属于哪个课程 | 2023年福大-软件工程实践-W班 |
|---|---|
| 这个作业要求在哪里 | 软件工程实践第二次作业——个人实战 |
| 这个作业的目标 | 1、编写程序输出2023年澳大利亚网球公开赛的选手信息和比赛结果 2、撰写博客 |
| 其他参考文献 | 单元测试和回归测试 |
| PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 60 |
| • Estimate | • 估计这个任务需要多少时间 | 30 | 60 |
| Development | 开发 | 1200 | 1490 |
| • Analysis | • 需求分析(包括学习新技术) | 60 | 90 |
| • Design Spec | • 生成设计文档 | 60 | 120 |
| • Design Review | • 设计复审 | 60 | 120 |
| • Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 60 | 90 |
| • Design | • 具体设计 | 120 | 180 |
| • Coding | • 具体编码 | 600 | 660 |
| • Code Review | • 代码复审 | 120 | 130 |
| • Test | • 测试(自我测试,修改代码,提交修改) | 120 | 100 |
| Reporting | 报告 | 180 | 130 |
| • Test Repor | • 测试报告 | 60 | 50 |
| • Size Measurement | • 计算工作量 | 60 | 40 |
| • Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 60 | 40 |
| 合计 | 1410 | 1680 |
助教已经为我们取得了JSON文件,我们需要的就只有去读取JSON文件,为此我使用了阿里巴巴的fastjson2来读取JSON文件里的数据。
因为指令都放在输入文件里面,所以要先去读取输入文件来分别去执行指令,根据指令来执行不同的方法去在输出文件中写入信息。实现输出比赛选手信息和结果的关键就是对JSON文件数据的解析。
建立一个Players类,里面包含静态方法playersOutput来输出比赛选手信息。实现通过jsonObject和JSONArray来遍历JSON数据获取选手信息。
建立一个Result类,里面包含静态方法resultOutput来输出比赛结果。实现通过jsonObject和JSONArray来遍历JSON数据获取比赛结果信息,由于需要各种跳,方法包含大量的for循环和if-else,显得是否冗余。
/**
* 输出选手信息
* @param path 输出文件的路径
*/
public static void playersOutput(String path) throws IOException
{
JSONArray playersJArr = playersJsonArr("src/data/players.json");
File file = new File(path);
FileWriter fileWriter = new FileWriter(file, StandardCharsets.UTF_8, true);
for (int i = 0; i < playersJArr.size(); i++)
{
JSONObject playerJObj = playersJArr.getJSONObject(i);
fileWriter.write("full_name:" + playerJObj.get("full_name").toString() + "\n");
String gender = playerJObj.get("gender").toString().equals("M") ? "male" : "female";
fileWriter.write("gender:" + gender + "\n");
JSONObject nationalityJO = playerJObj.getJSONObject("nationality");
String nationality = nationalityJO.get("name").toString();
fileWriter.write("nationality:" + nationality + "\n");
fileWriter.write("-----\n");
}
fileWriter.close();
}
/**
* 输出比赛结果
* @param date 日期
* @param path 输出文件的路径
*/
public static void resultOutput(String date, String path) throws IOException
{
if (isValidDate(date))
{
File file = new File(path);
FileWriter fileWriter = new FileWriter(file, StandardCharsets.UTF_8, true);
Path jsonPath = Paths.get("src/data/schedule/" + date + ".json");
String jsonStr = Files.readString(jsonPath, StandardCharsets.UTF_8);
JSONObject scheduleObj = JSONObject.parseObject(jsonStr);
JSONArray matchesJArr = scheduleObj.getJSONArray("matches");
for (int i = 0; i < matchesJArr.size(); i++)
{
JSONObject matchJObj = matchesJArr.getJSONObject(i);
String state = matchJObj.get("match_state").toString();
if (state.equals("Complete"))
{
fileWriter.write("time:" + matchJObj.get("actual_start_time").toString() + "\n");
JSONArray teamsJArr = matchJObj.getJSONArray("teams");
String score = "";
JSONArray scoreJArr1 = teamsJArr.getJSONObject(0).getJSONArray("score");
JSONArray scoreJArr2 = teamsJArr.getJSONObject(1).getJSONArray("score");
for ( int j = 0; j < scoreJArr1.size(); j++)
{
score += scoreJArr1.getJSONObject(j).get("game").toString() + ":" +
scoreJArr2.getJSONObject(j).get("game").toString();
if (j < scoreJArr1.size() - 1)
{
score += " | ";
}
}
for (int j = 0; j < teamsJArr.size(); j++)
{
JSONObject teamJObj = teamsJArr.getJSONObject(j);
if (teamJObj.get("status") != null && teamJObj.get("status").toString().equals("Winner"))
{
String teamID = teamJObj.get("team_id").toString();
JSONArray teamsJArr2 = scheduleObj.getJSONArray("teams");
String[] playersID = new String[2];
for (int k = 0; k < teamsJArr2.size(); k++)
{
JSONObject teamJObj2 = teamsJArr2.getJSONObject(k);
if (teamJObj2.get("uuid").toString().equals(teamID))
{
JSONArray playersJArr = teamJObj2.getJSONArray("players");
for (int m = 0; m < playersJArr.size(); m++)
{
playersID[m] = playersJArr.get(m).toString();
}
break;
}
}
JSONArray playersJArr = scheduleObj.getJSONArray("players");
String winner1 = "";
String winner2 = "";
for (int k = 0; k < playersJArr.size(); k++)
{
JSONObject playerJObj = playersJArr.getJSONObject(k);
if (playerJObj.get("uuid").toString().equals(playersID[0]))
{
winner1 = playerJObj.get("short_name").toString();
}
if (playersID[1] != null && playerJObj.get("uuid").toString().equals(playersID[1]))
{
winner2 = playerJObj.get("short_name").toString();
}
}
fileWriter.write("winner:" + winner1);
if (!winner2.equals(""))
{
fileWriter.write(" & " + winner2);
}
fileWriter.write("\n");
break;
}
}
fileWriter.write("score:" + score + "\n");
fileWriter.write("-----\n");
}
else
{
fileWriter.write("W/O\n");
fileWriter.write("-----\n");
}
}
fileWriter.close();
}
else
{
InvalidOutput.output(path, "N/A");
}
}
public static void main(String[] args)
{
File file = new File(args[1]);
try
{
if (!file.exists()) {
file.createNewFile();
}
else {
file.delete();
file.createNewFile();
}
BufferedReader reader;
reader = new BufferedReader(new FileReader(args[0]));
String cmd = reader.readLine();
while (cmd != null)
{
cmd = cmd.strip();
if (cmd.equals("players"))
{
Players.playersOutput(args[1]);
}
else if (cmd.startsWith("result "))
{
String date = cmd.substring(7);
date = date.strip();
Result.resultOutput(date, args[1]);
}
else
{
InvalidOutput.output(args[1], "Error");
}
cmd = reader.readLine();
}
}
catch (IOException ex)
{
System.out.println(ex.getMessage());
}
}
在for循环里一旦取得所需要的数据就break跳出循环。
@Test
public void main() {
File file = new File("input.txt");
try {
if (!file.exists()) {
file.createNewFile();
} else {
file.delete();
file.createNewFile();
}
FileWriter fileWriter = new FileWriter(file, StandardCharsets.UTF_8, true);
fileWriter.write("players\n");
fileWriter.write(" players\n");
fileWriter.write("player\n");
fileWriter.write("player s\n");
fileWriter.write("result 0116\n");
fileWriter.write(" result 0116\n");
fileWriter.write("result0116\n");
fileWriter.write("result 0301\n");
fileWriter.write("result sss\n");
fileWriter.write("ab/s'ds;s\n");
fileWriter.close();
} catch (IOException var3) {
System.out.println(var3.getMessage());
}
AOSearch.main(new String[]{"input.txt", "output.txt"});
}


有进行IOException的异常处理。
太久没写JAVA了,有点不熟悉怎么写代码。而且这个作业说实话还挺麻烦的,既要写代码还要写文档和博客,要花费不少时间。读取解析JSON文件也是从来都没有去做过的事,需要去网上查找许多资料,而且还要去理清楚JSON的结构(特别是输出比赛结果,跳来跳去的)。这次代码也完成的不是很好,有点冗余了,一堆for循环。希望下次作业能做得更好。