字符串数组
我是Java的新手,这里的问题不在于总代码,而在于数组大小和超出边界的问题。 这段代码应该用来模拟Java中的散列,但这不是主要的问题
错误:线程“main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:2
//import org.w3c.dom.NameList;
public class hash {
public static void main(String[] args) {
int tablesize = 4;
String[] Name = {
"ALY",
"om",
"j",
"l"
};
long Out = calc_hash(Name, tablesize);
System.out.println(Out);
}
public static long calc_hash(String[] key, int table_size) {
int i, l = key.length;
long hash = 0;
for (i = 0; i < l; i++) {
hash += Character.getNumericValue(key[i].charAt(i));
hash += (hash << 10);
hash ^= (hash >> 6);
}
hash += (hash << 3);
hash ^= (hash >> 11);
hash += (hash << 15);
if (hash > 0) return hash % table_size;
else return -hash % table_size;
}
}
答案 0 :(得分:0)
我不使用Java,但看着你的代码,我注意到了这一点:
l = key.length
key
是字符串数组,因此其长度为4,因此为l = 4
。然后使用l
作为循环的限制,将i
递增到l - 1
,并使用i
作为数组中元素和char位置的索引字符串(key[i].charAt(i)
)。这意味着如果第二个字符串没有至少2个字符,第3个字符串至少有3个字符,而第4个字符串至少有4个字符,那么您将得到错误
您希望在每个字符串中使用哪个值来循环?
答案 1 :(得分:0)
问题似乎在你的逻辑中。数组名称中的所有值的长度不同。一旦i for for循环的值达到2,找到的密钥是&#34; j&#34;只有长度1,没有charAt(2)。 不确定你在这里要做什么,但如果你有长度为4的数组中的所有元素,问题就会消失,试试。
String[] Name = {
"ABCD",
"ABCD",
"ABCD",
"ABCD"
};
或者它可能是一个错字,而应该
hash += Character.getNumericValue(key[i].charAt(0));