Каков наилучший способ преобразовать символы со знаком мэйнфрейма в соответствующие целочисленные значения в Java - PullRequest
0 голосов
/ 03 мая 2019

У меня есть сценарий, в котором символы, подобные приведенным ниже, будут поступать в файл фиксированной длины

{ABCDEFGHI = Этот набор символов представляет собой положительные числа 0123456789 соответственно

} JKLMNOPQR = Этот набор символовпредставляет отрицательные числа 0123456789 соответственно

Мне нужно преобразовать их в соответствующее число 0123456789 (положительное и отрицательное), используя Java.например:

45 {должно быть преобразовано в 450 (поскольку '{' представляет положительное '0')

45A должно быть преобразовано в 451 (поскольку 'A' представляет положительное '1')

45B следует преобразовать в 452 (поскольку «A» представляет положительное значение «2»)

45} следует преобразовать в -450 (поскольку «}» представляет отрицательное значение «0»)

45J следует преобразовать в -451 (поскольку «J» представляет отрицательное «1»)

45K следует преобразовать в -452 (поскольку «K» представляет отрицательное «2»)

Я не так хорош в Java, поэтому я использую приведенный ниже код, чтобы сначала заменить строку, содержащую вышеупомянутый символ, соответствующим числом, используя функцию replace.Я знаю, что должен быть лучший способ сделать это. Может ли кто-нибудь предложить мне это. Большое спасибо заранее.

public static String replaceChar(String str) {
        if (str.contains("{")) {
            str =  str.replace("{", "0");
        }   
        if (str.contains("A")) {
            str =  str.replace("A", "1");
        }
        if (str.contains("B")) {
            str =  str.replace("B", "2");
        }
        if (str.contains("C")) {
            str =  str.replace("C", "3");
        }
        if (str.contains("D")) {
            str =  str.replace("D", "4");
        }
        if (str.contains("E")) {
            str =  str.replace("E", "5");
        }
        if (str.contains("F")) {
            str =  str.replace("F", "6");
        }
        if (str.contains("G")) {
            str =  str.replace("G", "7");
        }
        if (str.contains("H")) {
            str =  str.replace("H", "8");
        }
        if (str.contains("I")) {
            str =  str.replace("I", "9");
        }
        if (str.contains("J")) {
            str =  str.replace("J", "1");
        }
        return str;
    }

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Вы можете отобразить свой алфавит на цифры, как уже показывал @Tim, используя буквы в качестве ключа и цифры в качестве значений, проверьте отрицательность с помощью регулярных выражений и окончательно замените ключи карты, содержащиеся во входной строке, на значения карты:

public static void main(String[] args) throws IOException {
    System.out.println(convert("45{"));
    System.out.println(convert("45A"));
    System.out.println(convert("45B"));
    System.out.println(convert("45}"));
    System.out.println(convert("45J"));
    System.out.println(convert("45K"));
}
public static long convert(String str){
    String alphabet = "{ABCDEFGHI}JKLMNOPQR";
    Map<String,String> map = Pattern.compile("")
                              .splitAsStream(alphabet)
                              .collect(Collectors.toMap(k->k, k->String.valueOf(alphabet.indexOf(k)%10)));
    boolean isNegative = false;
    if(Pattern.compile("[J-R\\}]+").matcher(str).find()){
        isNegative = true;
    }
    for(String letter : alphabet.split("")){
        str = str.replace(letter, map.get(letter));
    }
    long result = Long.parseLong(str);
    return isNegative ? - result: result;
}
0 голосов
/ 03 мая 2019

Мы можем попробовать выполнить итерацию по строке, а затем использовать модуль для вычисления числового значения:

String input = "ABCDEFGHIJKLMNOPQR";
StringBuilder sb = new StringBuilder();

for (int i=0; i < input.length(); ++i) {
    sb.append(String.valueOf((input.charAt(i) - 'A') % 10));
}

System.out.println(input);
System.out.println(sb.toString());

ABCDEFGHIJKLMNOPQR
012345678901234567

Мой вывод совпадает с тем, что есть в вашем вопросе, но в вашем вопросе есть некоторые опечатки в буквенных строках.

...