我正在解析一堆员工事故报告,以便进行报告。
事件报告本身是自由文本,我必须按身体位置对伤害进行分类。我试图避免if{}elseif{}elseif{}....}else{}
。
事件报告示例:
Employee slipped on wet stairs and injured her knee and right arm, and struck her head on the handrail.
应将“膝盖”,“手臂”和“头部”添加到受影响区域。
Employee was lifting boxes without approved protective equipment resulting in a back strain.
应该向受影响的区域添加“返回”。
While attempting to unjam copier, employee got right index finger caught in machinery resulting in a 1-inch cut.
应该在受影响的区域添加“手指”。
现在,我有:
private static StaffInjuryData setAffectedAreas(String incident, StaffInjuryData sid){
incident = incident.toUpperCase(); //eliminate case issues
if(incident.contains("HEAD")){
sid.addAffectedArea("HEAD");
}else if(incident.contains("FACE")){
sid.addAffectedArea("FACE");
}else if(incident.contains("EYE")){
sid.addAffectedArea("EYE");
}else if(incident.contains("NOSE")){
sid.addAffectedArea("NOSE");
}
//etc, etc, etc
return sid;
}
if-elseif-ad inifinitum是否有更简单/更有效的方法来执行此操作?
答案 0 :(得分:5)
一种方法是从各个身体部位构建正则表达式,使用它来搜索字符串,并将单个匹配项添加到列表中:
Pattern bodyParts = Pattern.compile("\\b(head|face|eye|nose)\\b", Pattern.CASE_INSENSITIVE);
在两端使用\b
会阻止部分匹配,例如在"head"
内的"forehead"
或"eye"
内找到"eyelid"
。
答案 1 :(得分:2)
添加Set<String>
作为参数,您可以在其中提供所有预期的关键字:
private static StaffInjuryData setAffectedAreas(String incident, StaffInjuryData sid, Set<String> keywords){
incident = incident.toUpperCase(); //eliminate case issues
for (String keyword : keywords){
if(incident.contains(keyword)){
sid.addAffectedArea(keyword);
}
}
return sid;
}
答案 2 :(得分:0)
也许创建一个包含所有部分{neck,shoulder,back等}的列表,然后检查该条目是否包含任何这些值?
答案 3 :(得分:0)
您可能能够创建某种容器(如列表或集合)以及所有不同的部分(IE头部,面部,眼部,鼻子,手指等),使用.split()分割字符串方法,然后将该字符串的每个部分与容器中的每个项目进行比较。
这可能更容易,但效率可能更低