尝试存储链表数组时出现ArrayStoreException

时间:2015-04-27 19:25:55

标签: java

我试图创建一个链接列表数组来处理哈希值冲突。我有一个对象数组,我试图存储linkedList,但它似乎不起作用。是否有我做错的事情,或者我应该采取更有效的途径。

这是我运行代码时遇到的错误。

Exception in thread "main" java.lang.ArrayStoreException: linkedList
at p7b.Insert(p7b.java:57)
at p7b.main(p7b.java:31)

这是我的方法

    public static void Insert(int hashVal, String key,int[] arrayNums, Object[] arrayString){


Node newNode = new Node(key,null);
linkedList list = new linkedList();

    if (arrayString[hashVal] == null){

        arrayString[hashVal] = list;
    }

以下是linkedList代码:

    public class linkedList{

private Node head;
private int size;


public linkedList(){
size = 0;
head = null;
}//end default constructor

public boolean isEmpty(){
return size == 0;
}//end isEmpty

public int size(){
return size;
}//end size

protected Node find(int index){
Node curr = head;

for(int skip = 0; skip < index; skip++){
curr = curr.getNext();
}//end for

return curr;

}//end find

public Object get(int index){

if (index >=0 && index < size) {

    // get reference to node, then data in node
    Node curr = find(index);
    Object dataItem = curr.item();
System.out.println(dataItem);
    return dataItem;

}
else
return "error";
}//end get

public void add(int index, String item){

if(index>= 0 && index < size+1){
  if(index == 0) {
  //insert the new node containing item at
  //beginning of list
  Node newNode = new Node(item,head);
  head = newNode;
  head.setNext(head);//--------------------


}

else {
  Node prev = find(index-1);

  //insert the new node containing item after
  //the node that prev references
  Node newNode = new Node(item,head.getNext()); //changed prev to head
  head.setNext(newNode);  //prev.next = newNode --//changed prev to ead
  head = newNode;
}//end if
}
sizeplus();

/*if(index == 16){//fffff
for(int i = 0; i < 50; i++){
System.out.println(head.item());-------------EXR
head = head.getNext();
System.out.println("----------");
}//ifffffff

}
*/
}//end add

public int sizeplus(){
size+=1;
return size;
}
public void remove(int index){
int num = index;
while(size>0){
//System.out.println("strt");
if(index>= 0 /*&& index < size*/){
  if(index == 0) {
  //delete the first node from the list
  System.out.println("REMOVED :"+head.item());//----------------EXR
  head = head.getNext();
}
else {
    Node prev = find(index-1);

    // delete the node after the node that prev
    //references, save regerence to node
    Node curr = prev.getNext();

    System.out.println(curr.item());
        if(size > 1){

    }
    else{
        System.out.print("is the last one left");
    }
    prev.setNext(curr.getNext());
    curr = prev.getNext();

    index+=num-1;

    }//end if
       size--;
//System.out.println(size+" <-size || index-> " +index);

      }//end if

}

}//end remove

public Node getH(){
  return head;
}

}//end class

另外:我如何从链表更改为下一个 这是我试过的。

    linkedList list = new linkedList(); 
    list = arrayString[i];

p7b.java:44: error: incompatible types
    list = arrayString[i];
                      ^
  required: linkedList
  found:    Object
1 error

2 个答案:

答案 0 :(得分:3)

从您的主要方法:

Object[] arrayString = new String[40];
...
Insert(hashVal,key,arrayNums,arrayString);

您正在将String数组传递给您的方法。 因此,您无法将linkedList个实例放入此数组中。

如果您希望此数组包含linkedList个实例,请将代码更改为:

Object[] arrayString = new linkedList[40];
...
Insert(hashVal,key,arrayNums,arrayString);

甚至更好:

linkedList[] arrayString = new linkedList[40];
...
Insert(hashVal,key,arrayNums,arrayString);

并更改Insert的签名以接受linkedList[]而不是Object[]

答案 1 :(得分:2)

这是罪魁祸首:

Object[] arrayString = new String[40];

您声称它是Object[],但实际支持String[]。 Java无法在编译时确定您无法将任何旧Object存储到该数组中,因此它会在运行时崩溃。

做的是正确输入数组 - 如果它要保留linkedList个实体,应该为{{1}实体。

linkedList

更具体地说,您在很多不同的地方使用该阵列。与其使用保持一致。

对您的代码有一些想法:它不是......正确的。您正在创建链接列表,对吧?除非列表本身由它们支持,否则没有理由使用数组。

我现在无法保证linkedList[] linkedLists = new linkedList[40]; 方法的正确性,但您根本不想使用数组。在该方法的之外创建一个链接列表的单个实例,并将您关注的所有数据存储在其中。

linkedList.add

(一般认为,链接列表不具有您只需插入的索引位置,因此public static void insert(String key, int index, linkedList list) { list.add(index, key); } 部分完全是多余的。)