检查字符串表示的数字是否在某个数字基数

时间:2015-12-14 15:33:41

标签: java android

我想实现一个算法,检查一个数字是否在某个数字基数中,因为大于10的数字基数的数字在它们的组成中有数字,由字符表示我被迫使用字符串。

我的实现理念如下:

private String values = "0123456789ABCDEF";

private boolean check_base(String number,String base) {
    StringBuilder no = new StringBuilder(number);
    while (no.length() != 0) {
        if (no.charAt(number.length() - 1) != '.' && values.indexOf(no.charAt(number.length() - 1)) >=
                values.indexOf(no.charAt(Integer.parseInt(base)))) {
            return false;
        }
        no.deleteCharAt(no.length() - 1);
    }
    return true;
}

我没有任何想法,为什么它崩溃我的调试看起来像这样:

private boolean check_base(String number,String base) { base: "16" number: "1.011.0"
    StringBuilder no = new StringBuilder(number); no: "1.011.0" number: "1.011.0"
    while (no.length() != 0) {

在这个while循环之后,我的应用程序崩溃了。我认为这是因为'.',但这就是no.charAt(number.length() - 1) != '.'条件的原因所以我认为这不是问题,或者我使用values.indexOf(no.charAt(number.length() - 1))的事实但我不知道为什么这会导致崩溃。

3 个答案:

答案 0 :(得分:2)

好的,这是你修改的代码。试一试,并将其与您的版本进行比较 由于no.charAt(number.length() - 1)没有变化,您的number错误。您需要no,例如no.charAt(no.length() - 1)。另外,你有另一个小问题。

public class Test0030 {

    public static void main(String[] args) {
        System.out.println(check_base("1.017.0", "8"));
        System.out.println(check_base("1.017.0", "7"));
        System.out.println(check_base("1.01F.0", "16"));
        System.out.println(check_base("1.01F.0", "15"));
    }

    private static String values = "0123456789ABCDEFG";

    private static boolean check_base(String number, String base) {
        StringBuilder no = new StringBuilder(number);
        while (no.length() != 0) {
            if (no.charAt(no.length() - 1) != '.' 
                    && 
                    values.indexOf(no.charAt(no.length() - 1)) >=
                    values.indexOf(values.charAt(Integer.parseInt(base)))) {
                return false;
            }
            no.deleteCharAt(no.length() - 1);
        }
        return true;
    }
}

答案 1 :(得分:1)

我认为你在那里做的事情可能有点复杂!您可以轻松地遍历字符串,检查每个值是否都在values字符串中。

编辑:一种可能性是将所有值存储在地图中(地图在初始化程序块中初始化,您也可以在构造函数中执行此操作,或者通常填充地图! )

private Map<Integer, String> values = new HashMap<Integer, String>();
{
    values.put(2,  "01");
    values.put(3,  "012");
    values.put(4,  "0123");
    values.put(5,  "01234");
    values.put(6,  "012345");
    values.put(7,  "0123456");
    values.put(8,  "01234567");
    values.put(9,  "012345678");
    values.put(10, "0123456789");
    values.put(11, "0123456789A");
    values.put(12, "0123456789AB");
    values.put(13, "0123456789ABC");
    values.put(14, "0123456789ABCD");
    values.put(15, "0123456789ABCDE");
    values.put(16, "0123456789ABCDEF");
}

private boolean check_base(String number, String base) {
    int intBase;
    try {
        intBase = Integer.parseInt(base);
    } catch(NumberFormatException e) {
        return false;
    }
    String neededVals = values.get(intBase);
    if (neededVals == null)
        return false;

    for (int i = 0; i < number.length(); i++) {
        char ch = number.charAt(i);
        if (ch != '.' && neededVals.indexOf(ch) == -1)
            return false;
    }
    return true;
}

第二种可能性(但更慢)将是在调用方法时生成适用于基数的字符集。

private String generateValues(int base) {
    String ret = "";
    for (int i = 0; i < base; i++) {
        if (i < 10)
            ret += (char)(i+'0');
        else {
            ret += (char)(i-10+'A');
            //ret += (char)(i-10+'a');      // uncomment this line in order to take small letters (a-f) into account!
        }
    }
    return ret;
}

private boolean check_base2(String number, String base) {
    try {
        int intBase = Integer.parseInt(base);
        String values = generateValues(intBase);
        for (int i = 0; i < number.length(); i++) {
            char ch = number.charAt(i);
            if (ch != '.' && values.indexOf(ch) == -1)
                return false;
        }
    } catch(NumberFormatException e) {
        return false;
    }
    return true;
}

答案 2 :(得分:0)

(这应该是评论,但我没有足够的地方)。

回答CătălinMongtean:

Long.valueOfString转换为Long。你可以选择给一个基础。例如:

long result = Long.valueOf("FF", 16);
//result = 255

如果为方法提供了一个包含未授权字符的字符串(给定基数),它将引发NumberFormatException

对于check_base,您可以像这样使用它:

private boolean check_base(String number,String base) {
  try {
    Long.valueOf(number, base);
    return true;
  } catch(NumberFormatException e) {
    return false;
  }
}