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 に答える