Java - возможно удалить все символы, кроме '.' а числа для double / float? - PullRequest
1 голос
/ 21 сентября 2011

Есть небольшая проблема, которую я пытаюсь решить, это часть кода, которая в основном проверяет версии по версиям на других машинах через файлы версий. Он просматривает имена этих файлов и в настоящий момент удаляет все символы.

Сначала я попробовал:

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 будет последней версией.

Лично я хотел бы, чтобы они приняли более стандартную и простую схему нумерации релизов, но это вне моего контроля.

Моя идея состояла в том, чтобы попытаться справиться с этим как с двойным. Я подумал, что вы можете использовать [^ 0-9.] Для поиска в Google, как показано ниже.

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

Но я особенно застрял на том, как я могу это сделать. Совет? Я полагаю, что часть моей проблемы в том, что я честно не очень хорошо понимаю регулярные выражения и как выбирать, какие части игнорировать в шаблоне.

1 Ответ

4 голосов
/ 21 сентября 2011

Я бы сказал, что забудьте забыть использовать 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+, которое означает «одну или несколько десятичных цифр, за которыми следует точка, а затем одна или несколько десятичных цифр», и мы ищем содержимое файла для первого появления этот образец.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...