【发布时间】:2018-04-20 06:48:38
【问题描述】:
目前我遇到了一个关于比较文本文件中的值的问题。以下是我的要求,我能说的有点独特。
我得到一个包含以下格式数据的文本文件。这些行是一系列特定格式的数字。
223---其他行值
354---其他行值
756---其他行值
754---其他行值
854---其他行值
923---其他行值
我必须验证所有行都按 2、3、7、8、9 的顺序开始。 2 和 9 之间可以有多行,以 2,3,7,7,8,3,7,7,8,9 开头。保证 2 和 9 行将是文件中的第一行和最后一行。 3 和 8 之间可以出现多个 7。
我为这个比较想出了下面的逻辑,但该逻辑仅适用于以 2、3、7、7、8、9 开头的行组合。
当出现多次像 2,3,7,7,8,3,7,7,8,9 这样的行时,它不起作用。有人可以帮我解决这里的问题以及我如何解决这个问题。如果有更好的选择或任何其他更好的方式满足我的要求,请提出建议,以便我可以使用它。输入文件的体积不高,差不多10到2万。
Set<String> recordTypeOrder = new HashSet<>();
BufferedReader rdr = new BufferedReader(new StringReader("path to my file here"));
for (String line = rdr.readLine(); line != null; line = rdr.readLine()) {
if(line.startsWith("2")){
recordTypeOrder.add("2");
}else if(line.startsWith("3")){
recordTypeOrder.add("3");
}else if(line.startsWith("7")){
recordTypeOrder.add("7");
}else if(line.startsWith("8")){
recordTypeOrder.add("8");
}else if(line.startsWith("9")){
recordTypeOrder.add("9");
}
}
Set<String> orderToCompare = new TreeSet<>(recordTypeOrder);
boolean compare = orderToCompare.equals(actualOrder());
if(!compare){
logger.info("== Processing failed =====");
throw new CustomException("======= Processing failed =======");
}
private static Set<String> actualOrder(){
Set<String> actualOrder= new HashSet<>();
actualOrder.add("2");
actualOrder.add("3");
actualOrder.add("7");
actualOrder.add("8");
actualOrder.add("9");
return actualOrder;
}
非常感谢
【问题讨论】:
-
你为什么使用不同类型的
Sets?只使用一种类型。 TreeSet 使用 AbstractSet::equals 方法 -
还要调试保证内容其实是一样的
-
你也可以看看正则表达式。
-
@Shanu Gupta 感谢您的意见。我已经采纳了您的建议并使用 LinkedHashMap 实现了它的工作正常。
标签: java string collections