我正在大学计算机科学B课程的基数排序实验室工作,但我一直遇到错误。我需要获得某个位置的一个数字的值,因此我将数字转换为字符串,并使用用户charAt(2(获得587的一位数字。然而,charAt返回55,这毫无意义,然后我得到了一个索引越界错误,因为该数字应该是0-9中的一位数字。该方法获取linkedList的头,将其从链表中删除,然后获取已删除的节点并将其添加到bucket中。
String s = null;
String val;
for(int i = 0; i <count;i++){
int temp = (Integer)tempNode.getValue();
val = temp+"";
int dval = (int) val.charAt(mod);
tempNode =(name.removeFirst(s));
bucket[dval].addToEnd(tempNode);
tempNode = name.getHead();
}
您对(int) val.charAt(mod)
所做的是获取字符的ascii值,请参阅,这实际上是字符7
的55
。您想要的是Character.getNumericValue()
来获取该字符的数值。
String str = "7";
System.out.println((int) str.charAt(0)); // Prints 55
System.out.println(Character.getNumericValue(str.charAt(0))); // Prints 7
在我看来,您似乎想根据temp
数字的最后一位来决定bucket
索引(0到9(。不需要经过String
/charAt
/getNumericValue()
迂回,只需使用Java:的"division rest"运算符
int dval = temp % 10;
或者广义的(如果你不想只坚持10个桶(:
int dval = temp % bucket.length;
只要确保temp
不会变为负数,那么除法休息也会变为负数:-(。除法休息方法除了更短、更不容易出错外,速度也快得多。