首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查版本字段大于给定文件名的文件名

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

Stack Overflow用户
提问于 2013-05-17 00:02:47
回答 1查看 40关注 0票数 0

我有一个update_0_9_26格式的文件。我想编写java代码,它将检查所有版本大于0_9_26的文件。例如,0_9_27等等。我必须对从这个计算中检索到的文件执行处理。

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

示例输入:

代码语言:javascript
复制
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”时):

代码语言:javascript
复制
update_0_9_27.sql 
update_0_9_28.sql 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-17 00:28:15

一步一步的简单指南:

  1. 使用new File("myDirName").list()从文件系统获取文件名
  2. 将该列表排序到使用自定义比较器创建的TreeSet中(见下文)。
  3. 遍历集合,按顺序处理文件,但不包括您已经看到的文件。使用myTreeSet.tailSet(lastFileToNotProcess, 'true')获取仅包含这些元素的集合的视图。

有趣的部分在步骤2中。下面是一个自定义比较器,它对输入进行标记并对整数令牌进行数字比较,并按字母顺序比较非整数令牌:

代码语言:javascript
复制
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);
      }
   }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16599401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档