我想实现一个算法,检查一个数字是否在某个数字基数中,因为大于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))
的事实但我不知道为什么这会导致崩溃。
答案 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.valueOf
将String
转换为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;
}
}