比较不在java中工作的文件中的值

比较不在java中工作的文件中的值,java,string,collections,Java,String,Collections,目前我遇到了一个关于比较文本文件中的值的问题。以下是我的要求,这是一个有点独特的是我可以说 我得到一个文本文件,其中包含以下格式的数据。行是一系列特定格式的数字 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 我为这

目前我遇到了一个关于比较文本文件中的值的问题。以下是我的要求,这是一个有点独特的是我可以说

我得到一个文本文件,其中包含以下格式的数据。行是一系列特定格式的数字

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,它不起作用。有人能帮我解决这个问题吗。如果有一个更好的选择或任何其他更好的方式为我的要求,请建议,以便我可以使用它。输入文件中的容量不高,几乎可以达到1万到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;
  }
Set recordTypeOrder=newhashset();
BufferedReader rdr=new BufferedReader(new StringReader(“此处指向我的文件的路径”);
对于(字符串line=rdr.readLine();line!=null;line=rdr.readLine()){
如果(第2行开始){
recordTypeOrder.添加(“2”);
}else if(第3行开始){
recordTypeOrder.添加(“3”);
}else if(第7行开始){
recordTypeOrder.添加(“7”);
}else if(第8行开始){
recordTypeOrder.添加(“8”);
}else if(第9行开始){
recordTypeOrder.添加(“9”);
}
}
Set orderToCompare=新树集(recordTypeOrder);
布尔比较=orderToCompare.equals(actualOrder());
如果(!比较){
logger.info(“==处理失败===”);
抛出新的CustomException(“==========处理失败=====”);
}
私有静态集合控制器(){
Set actuallorder=new HashSet();
上议院添加(“2”);
上议院添加(“3”);
上议院添加(“7”);
上议院添加(“8”);
上议院添加(“9”);
返回领主;
}

非常感谢您需要存储
3,7,7,8
的顺序和计数。我认为
treeset
不起作用。您可以尝试其他数据结构,如
LinkedHashMap
。这样,您就可以将所需的数据存储在
LinkedHashMap
中,然后编写一个自定义函数对其进行验证。

为什么要使用不同类型的
集合
?只需使用一种类型。TreeSet使用AbstractSet::equals方法进行调试,以确保内容实际上与正则表达式相同。您也可以查看正则表达式。@Shanu Gupta感谢您的输入。我已经采纳了你的建议,并使用LinkedHashMap实现了它,它工作得很好。