关于字符串数组

时间:2017-11-09 20:53:08

标签: java arrays string

字符串数组

我是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;
  }
}

2 个答案:

答案 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));