Java 检查版本字段大于给定文件名的文件名

Java 检查版本字段大于给定文件名的文件名,java,comparison,Java,Comparison,我有一个以下格式的文件update\u 0\u 9\u 26。我想编写java代码,它将检查所有版本大于0\u 9\u 26的文件。例如0\u9\u27等等。我必须对从该计算中检索到的文件进行处理 如何解析文件名以检索大于引用名称的文件名? 输入示例: update_0_9_26.sql update_0_9_27.sql update_0_9_28.sql update_1_0_0.sql update_1_0_1.sql update_1_0_2.sql 预期输出(搜索“大于更新\u

我有一个以下格式的文件
update\u 0\u 9\u 26
。我想编写java代码,它将检查所有版本大于
0\u 9\u 26
的文件。例如
0\u9\u27
等等。我必须对从该计算中检索到的文件进行处理

如何解析文件名以检索大于引用名称的文件名?

输入示例:

update_0_9_26.sql 
update_0_9_27.sql 
update_0_9_28.sql 
update_1_0_0.sql
update_1_0_1.sql
update_1_0_2.sql
预期输出(搜索“大于
更新\u 0\u 9\u 26
”时):


简单的分步指南:

  • 使用
    newfile(“myDirName”).list()从文件系统获取文件名
  • 将该列表排序为使用自定义比较器创建的树集(见下文)
  • 遍历集合,按顺序处理文件,但不包括已看到的文件。使用
    myTreeSet.tailSet(lastFileToNotProcess,'true')
    获取仅包含这些元素的集合视图
  • 有趣的部分在步骤2中。下面是一个自定义比较器,它将输入标记化,并按数字顺序比较整数标记,按字母顺序比较非整数标记:

    class TokenizingComparator implements Comparator<String> {
       private String separator;
       private static Pattern intPattern = Pattern.compile("[0-9]+");
       public TokenizingComparator(String separator) { this.separator = separator; }
       public int compare(String a, String b) {
          String pa[] = a.split(separator);
          String pb[] = b.split(separator);
          for (int ia=0, ib=0; ia<pa.length && ib<pb.length; ia++,ib++) {
              int rc = comparePart(pa[ia], pb[ib]);
              if (rc != 0) return rc;
          } 
          return (pa.length != pb.length) ? 
             pa.length - pb.length : 0;
       }
       private comparePart(String a, String b) {
          if (intPattern.matcher(a).matches() && intPattern.matcher(b).matches()) {
             return Integer.parseInt(a) - Integer.parseInt(b);
          } else {
             return a.compareTo(b);
          }
       }
    }
    
    类TokenizingComparator实现Comparator{
    专用字符串分隔符;
    私有静态模式intPattern=Pattern.compile(“[0-9]+”);
    公共TokenizingComparator(字符串分隔符){this.separator=separator;}
    公共整数比较(字符串a、字符串b){
    字符串pa[]=a.split(分隔符);
    字符串pb[]=b.split(分隔符);
    
    对于(int ia=0,ib=0;iaI在那里看不到任何问题。@Sjuan76我编辑了我的问题。编辑是为了使问题更突出。如果编辑过度,请发表评论。
    class TokenizingComparator implements Comparator<String> {
       private String separator;
       private static Pattern intPattern = Pattern.compile("[0-9]+");
       public TokenizingComparator(String separator) { this.separator = separator; }
       public int compare(String a, String b) {
          String pa[] = a.split(separator);
          String pb[] = b.split(separator);
          for (int ia=0, ib=0; ia<pa.length && ib<pb.length; ia++,ib++) {
              int rc = comparePart(pa[ia], pb[ib]);
              if (rc != 0) return rc;
          } 
          return (pa.length != pb.length) ? 
             pa.length - pb.length : 0;
       }
       private comparePart(String a, String b) {
          if (intPattern.matcher(a).matches() && intPattern.matcher(b).matches()) {
             return Integer.parseInt(a) - Integer.parseInt(b);
          } else {
             return a.compareTo(b);
          }
       }
    }