1

私が解決しようとしている小さな問題があります。これは、基本的にバージョン ファイルを介して他のマシンのバージョンに対してバージョンをチェックするコードの一部です。これらのファイルの名前を調べて、現在すべての文字を取り除きます。

最初に、私は試しました:

private String getLatestVerFile( List<String> verFiles ) {

    String latestVerFile = null;
    long lastMod = Long.MIN_VALUE;

    for (String file : verFiles ) {

        if ( Long.parseLong( file.replaceAll( "[^0-9]", "" ) ) > lastMod ) {
            latestVerFile = file;
            lastMod = Long.parseLong( file.replaceAll( "[^0-9]", "" ) );
        }
    }

    return latestVerFile;       
}

ここでの問題は、複数のバージョン ファイルが指定されていることです。これは、最新のファイルを返すことを意図しており、場合によっては返されません。

ex:
R9.10 = 910
R9.26_P1 = 9261
R9.01 = 901
R10.1 = 101

この場合、R10.1 が最新バージョンになります。

個人的には、より標準的で簡単なリリース番号付け方式を採用してほしいと思っていますが、それは私の手に負えません。

私の考えは、これを double として処理することでした。以下に示すように、いくつかの Google 検索で [^0-9.] を使用できると思いました。

private String getLatestVerFile( List<String> verFiles ) {

    String latestVerFile = null;
    double lastMod = Double.MIN_VALUE;

    for (String file : verFiles ) {

        if ( Double.parseDouble( file.replaceAll( "[^0-9.]", "" ) ) > lastMod ) {
            latestVerFile = file;
            lastMod = Double.parseDouble( file.replaceAll( "[^0-9.]", "" ) );
        }
    }

    return latestVerFile;       
}

とはいえ、うまくいきません。ファイル名がたとえば R9.10.ver で、「9.10」と出てくる可能性があるという事実が、これを台無しにしている可能性があると思います。そしてそれをダブルにしようとしています。同僚は R(\d+.\d+)(_P\d+1).ver を使用すると言っていましたが、そのすべてをどこから始めるべきか、または文字列から何を除外するかをどのように知るのかわかりません。

目標はこれを取得することです:

ex:
R9.10 = 9.10
R9.20_P1 = 9.201
R10.11 = 10.11
R10.20_P1 = 10.201

しかし、私はこれをどのように行うことができるかに特にこだわっています。アドバイス?私の問題の一部は、正直なところ正規表現をよく理解していないことと、パターンのどの部分を無視するかを選択する方法だと思います。

4

1 に答える 1

4

Double の使用を忘れて (リリース番号は浮動小数点数ではありません)、ReleaseNumber という独自の同等のクラスを作成します。

//details left out for brevity
public class ReleaseNumber implements Comparable<ReleaseNumber> {
    private final int majorVersion;
    private final int minorVersion;
}

次に、正規表現を使用して、各文字列からリリース番号のフィールドを取得できます。

//...
List<String> fileNames /* = ... */;

String latestVersionFileName = Collections.max(fileNames, new Comparator<String>() {
    public int compare(String file1, String file2) {
        return getReleaseNumberFromFileName(file1)
                 .compareTo(getReleaseNumberFromFileName(file2));
    }
}

//...

Pattern releaseNumberPattern = Pattern.compile("(\\d+)\\.(\\d+)");

public ReleaseNumber getReleaseNumberFromFileName(String fileName) {
    Matcher releaseNumberMatcher = releaseNumberPattern.matcher(fileName);
    if (releaseNumberMatcher.find()) {
        int majorVersion = Integer.parseInt(releaseNumberMatcher.group(1));
        int minorVersion = Integer.parseInt(releaseNumberMatcher.group(2));
        ReleaseNumber version = new ReleaseNumber(majorVersion, minorVersion);
        return version;
    }
    throw new RuntimeException();
}

\d+\.\d+この場合、 「1 桁以上の 10 進数、その後にドット、1 桁以上の 10 進数」という意味の単純な正規表現を使用し、そのパターンが最初に出現するファイルの内容を検索します。

于 2011-09-20T21:35:18.993 に答える