【问题标题】:Convert from decimal to binary, octal, hexadecimal with char array使用 char 数组从十进制转换为二进制、八进制、十六进制
【发布时间】:2018-04-21 03:03:42
【问题描述】:

我已经将一些十进制数转换为二进制、八进制和十六进制系统。为此,我不必使用任何收藏和图书馆。所以现在我需要更改我的实现,因为我使用 String 来存储结果,而我应该使用 char 数组。

我目前的实现:

public static String convertDecimal(int number, int base){
    String result = "";
    while (number > 0) {
        if (base == 16) {
            int hexalNumber = number % base;

            char hexDigit = (hexalNumber <= 9 && hexalNumber > 0) ? 
                    (char) (hexalNumber + '0') : 
                    (char) (hexalNumber - 10 + 'A');
            result = hexDigit + result;
            number = number / base;
        }
        if (base == 8 || base == 2) {
            int remainder = number % base;
            result = remainder + result;
            number = number / base;
        }
    }
    return result;
}

如何更改我的实现以便从方法中返回 char[]?我应该完全改变我的转换算法的逻辑吗?

如果有任何帮助,我将不胜感激。

【问题讨论】:

  • String 类有一个方法toCharArray
  • 使用for 循环而不是while 循环,而不是result = hexDigit + resultresult[i] = hexDigit 假设结果是一个char[] 并且i 是你的迭代器对于base 8 和2 相同
  • @BadMiscuit 这应该行不通。你如何初始化这样一个数组?你会考虑多大的尺寸?
  • @Yash 数数
  • 您需要更改转换算法的逻辑,因为它不处理负数。或零。首先为此编写一些单元测试。

标签: java arrays binary hex decimal


【解决方案1】:

String 有一个将自己转换为char[] 的方法,使用它即可:

return result.toCharArray();

【讨论】:

  • 在这种情况下是否建议使用字符数组列表?
  • 但是根据任务我不能使用ArrayLists或者Strings,包括具体的方法比如toCharArray
【解决方案2】:

如果他们想要一个 char 数组,他们可能不会只喜欢一个

return result.toCharArray();

由于数组的大小是固定的,所以可以先数一下位数:

public static char[] convertDecimal(int number, int base) {
    if (number < 0) {
        char[] positiveResult = convertDecimal(-number, base);
        char[] negativeResult = ...
        return negativeResult;
    } else if (number == 0) {
        return new char[] { '0' };
    }
    int digits = 0;
    int n = number;
    while (n != 0) {
        ++digits;
        n /= base;
    }
    char[] result = new char[digits];
    for (int i = 0; i < digits; ++i) {
        ... result[... i ...] = ...; ++i
    }
    return result;
}

【讨论】:

    【解决方案3】:

    我已在您的代码中对此进行了测试:

    convertDecimal(7856421, 16);
    

    对于这个调用和编辑你的代码如下(我没有删除任何行,只是添加了我已经添加了汽车[]):

    public static String convertDecimal(int number, int base) {
    char[] resultChar = new char[0];
    String result = "";
    
    while (number > 0) {
        if (base == 16) {
        int hexalNumber = number % base;
    
        char hexDigit = (hexalNumber <= 9 && hexalNumber > 0) ? (char) (hexalNumber + '0')
            : (char) (hexalNumber - 10 + 'A');
        result = hexDigit + result;
        int totalLength = resultChar.length + 1;
        char[] aux = new char[totalLength];
        int i = 0;
        for (i = 0; i < resultChar.length; i++) {
            aux[i] = resultChar[i];
        }
        aux[totalLength - 1] = hexDigit;
        resultChar = aux;
    
        number = number / base;
        }
        if (base == 8 || base == 2) {
        int remainder = number % base;
        result = remainder + result;
    
        number = number / base;
        }
    
    }
    return result;
    }
    

    你在 resultChar[] 中有反转的结果(在这种情况下你得到 77E125 并且 char[] 有 [5, 2, 1, E, 7, 7])。现在你只需要将它倒过来。

    【讨论】: