0

我有以下格式的文件update_0_9_26。我想编写 java 代码来检查所有版本大于0_9_26. 例如0_9_27等等。我必须对从此计算中检索到的文件执行处理。

我应该如何解析文件名以检索大于参考名称的文件名?

示例输入:

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

预期输出(搜索“大于update_0_9_26”时):

update_0_9_27.sql 
update_0_9_28.sql 
4

1 回答 1

0

简单的分步指南:

  1. 从文件系统中获取文件名,使用new File("myDirName").list()
  2. 将该列表排序为使用自定义比较器创建的 TreeSet(见下文)。
  3. 遍历集合,按顺序处理您的文件,但不包括您已经看过的文件。用于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);
      }
   }
}
于 2013-05-17T00:28:15.103 回答