最近在准备华为OD机试的过程中,遇到一道关于核酸检测结果统计的编程题。题目要求设计一个Java程序,能够高效准确地统计大规模人群的核酸检测结果。这类问题在实际工作中非常常见,特别是在当前环境下,快速处理检测数据对公共卫生管理至关重要。
这道题的核心在于考察以下几个能力点:
经过分析,我决定采用HashMap作为主要数据结构。原因如下:
java复制Map<String, String> testResults = new HashMap<>();
程序的主要处理流程分为三个步骤:
考虑到实际应用场景,输入数据可能来自不同渠道:
这里我们以文件输入为例:
java复制public void loadDataFromFile(String filePath) throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(filePath));
String line;
while ((line = reader.readLine()) != null) {
String[] parts = line.split(",");
if (parts.length == 2) {
testResults.put(parts[0].trim(), parts[1].trim());
}
}
reader.close();
}
统计功能需要计算:
java复制public void analyzeResults() {
int total = testResults.size();
int positive = 0;
int negative = 0;
int invalid = 0;
for (String result : testResults.values()) {
if ("阳性".equals(result)) {
positive++;
} else if ("阴性".equals(result)) {
negative++;
} else {
invalid++;
}
}
// 计算比例等统计信息...
}
输出格式需要考虑可读性和后续处理便利性:
java复制public void generateReport() {
System.out.println("===== 核酸检测统计报告 =====");
System.out.println("总检测人数: " + total);
System.out.printf("阳性人数: %d (%.2f%%)\n", positive, positive*100.0/total);
System.out.printf("阴性人数: %d (%.2f%%)\n", negative, negative*100.0/total);
System.out.println("无效结果: " + invalid);
}
当数据量特别大时(如百万级记录),需要考虑:
java复制// 使用BufferedReader逐行读取,避免内存溢出
// 考虑使用并行流提高处理速度
testResults.values().parallelStream().forEach(...);
需要特别注意的边界条件:
java复制// 在put操作前进行检查
if (testResults.containsKey(id)) {
// 处理重复ID情况
} else {
testResults.put(id, result);
}
编写全面的测试用例:
java复制@Test
public void testAnalyzeResults() {
// 准备测试数据
testResults.put("001", "阳性");
testResults.put("002", "阴性");
// 执行测试
analyzer.analyzeResults();
// 验证结果
assertEquals(2, analyzer.getTotal());
assertEquals(1, analyzer.getPositive());
}
准备不同规模的测试数据:
验证内容包括:
java复制public enum TestResult {
POSITIVE("阳性"),
NEGATIVE("阴性"),
INVALID("无效");
private String displayName;
// 构造方法等...
}
为应对未来可能的需求变化:
java复制public interface DataLoader {
void loadData(Map<String, String> targetMap);
}
public class FileDataLoader implements DataLoader {
// 实现文件加载逻辑
}
当处理超大规模数据时:
通过性能测试发现:
在真实项目中使用时发现:
java复制// 数据清洗示例
public String sanitizeResult(String rawResult) {
if (rawResult == null) return "无效";
String trimmed = rawResult.trim();
if (trimmed.contains("阳")) return "阳性";
if (trimmed.contains("阴")) return "阴性";
return "无效";
}
以下是整合后的核心实现:
java复制public class NucleicAcidTestAnalyzer {
private final Map<String, String> testResults = new HashMap<>();
private int total;
private int positive;
private int negative;
private int invalid;
public void loadData(String filePath) throws IOException {
// 实现数据加载...
}
public void analyze() {
// 实现统计分析...
}
public void generateReport() {
// 实现报告生成...
}
// 其他辅助方法...
}
这道题在华为OD机试中主要考察:
建议在实现时特别注意: