软件工程实践第二次作业-文件读取
这个作业属于哪个课程 | 软件工程社区 |
---|---|
这个作业要求在哪里 | 软件工程第二次作业 |
这个作业的目标 | 完成对世界游泳锦标赛跳水项目相关数据的收集,并实现一个能够对赛事数据进行统计的控制台程序 |
Gitcode项目地址
gitcode地址: link
PSP表格
PSP | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 50 | 40 |
• Estimate | • 估计这个任务需要多少时间 | 10 | 15 |
Development | 开发 | 300 | 500 |
• Analysis | • 需求分析(包括学习新技术) | 30 | 50 |
• Design Spec | • 生成设计文档 | 30 | 30 |
• Design Review | • 设计复审 | 40 | 30 |
• Coding Standard | • 代码规范 (为目前的开发制定合适的规范) | 20 | 30 |
• Design | • 具体设计 | 120 | 120 |
• Coding | • 具体编码 | 400 | 450 |
• Code Review | • 代码复审 | 30 | 30 |
• Test | • 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | 60 | 60 |
• Test Repor | • 测试报告 | 80 | 80 |
• Size Measurement | • 计算工作量 | 20 | 15 |
• Postmortem & Process Improvement Plan | • 事后总结, 并提出过程改进计划 | 50 | 45 |
合计 | 1300 | 1555 |
解题思路描述
首先用阿里巴巴的fastjson2对跳水官网json数据进行读取,获取利用jsonobject和jsonarray将运动员信息和赛事信息的json数据转化为字符串,再将他们按格式输出。
先构造一个DWASearch类,再分别构造player和result类,最后将方法都放在tools类中,由DWASearch类做main函数启动。
关键代码展示
输出运动员信息
public void showPlayer(String outputFileName) {
List<Player> players = new ArrayList<>();
InputStream is = DWASearch.class.getClassLoader().getResourceAsStream("data/athletes.json");
String jsonStr = "";
try {
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null) {
buffer.append(line);
}
jsonStr = buffer.toString();
} catch (IOException e) {
e.printStackTrace();
}
JSONArray jsonArray = JSONArray.parseArray(jsonStr);
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject object = jsonArray.getJSONObject(i);
String Country = object.getString("CountryName");
JSONArray Participations = object.getJSONArray("Participations");
for (int j = 0; j < Participations.size(); j++) {
String fullName = Participations.getJSONObject(j).getString("PreferredFirstName") + " "
+ Participations.getJSONObject(j).getString("PreferredLastName");
String Gender = (Participations.getJSONObject(j).getInteger("Gender") == 1 ? "Male" : "Female");
players.add(new Player(fullName, Gender, Country));
}
sortPlayers(players);
writePlayersToFile(players, outputFileName);
//将运功员信息输出至文件
}
}
输出比赛结果信息
public void showResult(String outputFileName, String eventAdress) {
List<Result> results = new ArrayList<>();
InputStream is = DWASearch.class.getClassLoader().getResourceAsStream(eventAdress);
String jsonStr = "";
try {
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));
StringBuffer buffer = new StringBuffer();
String line = "";
while ((line = in.readLine()) != null) {
buffer.append(line);
}
jsonStr = buffer.toString();
} catch (IOException e) {
e.printStackTrace();
}
JSONObject object = JSONObject.parseObject(jsonStr);
JSONArray heat = object.getJSONArray("Heats");
JSONObject object1 = heat.getJSONObject(0);
JSONArray result = object1.getJSONArray("Results");// 获取决赛数据
for (int i = 0; i < result.size(); i++) {
JSONObject playerResult = result.getJSONObject(i);
String fullname = playerResult.getString("FullName");
String rank = playerResult.getString("Rank");
String totalpoints = playerResult.getString("TotalPoints");
String detailpoints = "";
List<String> doubleplayer = new ArrayList<>();
//判断是否双人比赛
if (playerResult.getString("Competitors") != null) {
JSONArray competitors = playerResult.getJSONArray("Competitors");
for (int j = 0; j < competitors.size(); j++) {
JSONObject eachone = competitors.getJSONObject(j);
String name = eachone.getString("LastName") + " " + eachone.getString("FirstName");
doubleplayer.add(name);
}
Collections.sort(doubleplayer);
fullname = "'" + doubleplayer.get(0) + "&" + doubleplayer.get(1) + "'";
}
JSONArray dives = playerResult.getJSONArray("Dives");
for (int k = 0; k < dives.size(); k++) {
JSONObject single = dives.getJSONObject(k);
String Single = single.getString("DivePoints");
if (k < dives.size() - 1) {
detailpoints = detailpoints + Single + "+";
} else {
detailpoints = detailpoints + Single;
}
}
results.add(new Result(fullname, rank, detailpoints, totalpoints));
writeResultsToFile(results, outputFileName);
}
}
写入文件
private void writeResultsToFile(List<Result> results, String fileName) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName,true))) {
for (Result result : results) {
writer.write("FullName: " + result.getFullname() + "\n");
writer.write("Rank: " + result.getRank() + "\n");
writer.write("Score:" + result.getDetailpoints() + "=" + result.getTotalpoints() + "\n");
writer.write("-----\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
private void writePlayersToFile(List<Player> players, String fileName) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName,true))) {
for (Player player : players) {
writer.write("Full Name: " + player.getFullName() + "\n");
writer.write("Gender: " + player.getGender() + "\n");
writer.write("Country: " + player.getCountry() + "\n");
writer.write("-----\n");
}
} catch (IOException e) {
e.printStackTrace();
}
}
代码启动器
public class DWASearch {
public static void main(String[] args) throws Exception {
// if (args.length != 2) {
// System.out.println("Usage: java -jar DWASearch.jar input.txt output.txt");
// return;
// }
String inputFileName = args[0];
String outputFileName = args[1];
tools tool = new tools();
tool.input(inputFileName, outputFileName);
}
}
性能改进
在输入检测端我用了if-else结构来检测输入结果,内存占用较高,可以改成hashmap来写,节省内存,减少读取时间
单元测试
public class toolsTest {
@Test
public void input() throws IOException {
String str = "input.txt";
String str2 = "output.txt";
new tools().input(str,str2);
}
@Test
public void showPlayer() {
String str = "input.txt";
String str2 = "output.txt";
new tools().showPlayer(str2);
}
@Test
public void showResult() {
String str2 = "output.txt";
new tools().showResult(str2,"data/men 1m springboard.json");
}
@Test
public void showResult1() {
String str2 = "output.txt";
new tools().showResult(str2,"data/men 1m springboard.json");
}
}
以下是第一个用例测试的覆盖率
异常处理
catch (IOException e) {
e.printStackTrace();
}
项目中出现的绝大多数异常都使用try/catch环绕,并将异常放入堆栈中。对于命令行出现的找不到文件异常,即是改变读取文件的方式解决。
心得体会
本次实践让我学会了用fastjson2对json文件的读取操作,更加熟悉了对java的使用和文件的读取写入方法,以及gitcode的操作