Как увеличить или уменьшить буквенно-цифровую строку для заданного диапазона? - PullRequest
0 голосов
/ 05 февраля 2019

Мне нужно оптимизированное решение для увеличения и уменьшения буквенно-цифровой строки, как в Excel.Когда я указываю алфавитно-цифровую строку с диапазоном, она должна давать мне оба уменьшенных n увеличенных списка значений.Например, мне нужен диапазон + -10 буквенно-цифровой строки как.PN - символ альфа может входить в начало / середину / конец

 1. A2000018 -> A2000008 to A2000028  
 2. A39999 -> A39989 to A40009  
 3. A00005 -> A00001 to A00015  
 4. AZ00005 -> AZ00001 to AZ00015
 5. A342S0004 -> A342S0001 to A342S0014
 6. A342S9999 -> A342S9989 to A342S10009
 7. 1234A -> 1224A to 1244A
 8. 0003A -> 0001A to 0013A

1 Ответ

0 голосов
/ 06 февраля 2019
public static List<String> getRangeList(String docNumber, int range) {

    List<String> rangeList = new ArrayList<>();

    System.out.println("Document Number Received " + docNumber);

    /**
     * REGEX checks for String value starting with 1 character as alpha and rest numeric
     */
    boolean trailingAlphabet = false;
    boolean leadingNtrailingAlphabet = false;
    boolean leadingNtrailingNumber = false;
    String patternStr = "";

    if (docNumber.trim().matches("[a-zA-Z]{1,5}[0-9]{1,20}[a-zA-Z]{1,5}$")) { //String docNumber = "AD234SD1234 ";
        patternStr = "(.*?)(\\d+)(.*?)$";
        leadingNtrailingAlphabet = true;

    } else if (docNumber.trim().matches("[0-9]{1,20}[a-zA-Z]{1,5}[0-9]{1,20}+$")) { //String docNumber = "1234AD1234 ";
        patternStr = "(\\d+)(.*?)(\\d+)$";
        leadingNtrailingNumber = true;
    }  else if (docNumber.trim().matches("[0-9]{1,20}[a-zA-Z]{1,4}+$")) { //String docNumber = "1234A ";
        patternStr = "(\\d+)(.*?)$";
        trailingAlphabet = true;
    } else if (docNumber.trim().matches("[a-zA-Z]{1,5}[0-9]+$")
            || docNumber.trim().matches("[a-zA-Z]{1,5}[0-9]{1,20}[a-zA-Z]{1,4}[0-9]+$")) { 
        patternStr = "(.*?)(\\d+)$";

    }

    Pattern pattern = Pattern.compile(patternStr);
    Matcher matcher = pattern.matcher(docNumber.trim());

    if (matcher.find()) {

        String firstAlpha = "";
        String origNumber = "";
        String lastAlpha = "";

        if (trailingAlphabet) {
            firstAlpha = matcher.group(2);
            origNumber = matcher.group(1);

        } else if (leadingNtrailingAlphabet) {
            firstAlpha = matcher.group(1);
            origNumber = matcher.group(2);
            lastAlpha = matcher.group(3);

        } else if (leadingNtrailingNumber) {
            firstAlpha = matcher.group(1);
            lastAlpha = matcher.group(2);
            origNumber = matcher.group(3);

        } else {
            firstAlpha = matcher.group(1);
            origNumber = matcher.group(2);
        }
        //System.out.println("1 Alpha : " + firstAlpha + " origNNum : " + origNumber + " lastAlpha : " + lastAlpha);

        String incrNumStr = origNumber;
        String dcrNumStr = origNumber;

        for (int i = 0; i < range; i++) {

            if (Integer.parseInt(dcrNumStr) - 1 <= 0) {
                break;
            }

            dcrNumStr = String.format("%0" + dcrNumStr.length() + "d", Integer.parseInt(dcrNumStr) - 1);

            if (leadingNtrailingNumber) {
                rangeList.add(firstAlpha + lastAlpha + dcrNumStr);
            } else if (leadingNtrailingAlphabet) {
                rangeList.add(firstAlpha + dcrNumStr + lastAlpha);
            } else if (trailingAlphabet) {
                rangeList.add(dcrNumStr + firstAlpha);
            } else {
                rangeList.add(firstAlpha + dcrNumStr);
            }
        }

        for (int i = 0; i < range; i++) {
            incrNumStr = String.format("%0" + incrNumStr.length() + "d", Integer.parseInt(incrNumStr) + 1);

            if (leadingNtrailingNumber) {
                rangeList.add(firstAlpha + lastAlpha + incrNumStr);
            } else if (leadingNtrailingAlphabet) {
                rangeList.add(firstAlpha + incrNumStr + lastAlpha);
            } else if (trailingAlphabet) {
                rangeList.add(incrNumStr + firstAlpha);
            } else {
                rangeList.add(firstAlpha + incrNumStr);
            }
        }

        Collections.sort(rangeList);
        System.out.println(rangeList);
    }

    return rangeList;

}
...