我试图创建一个链接列表数组来处理哈希值冲突。我有一个对象数组,我试图存储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
答案 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);
}
部分完全是多余的。)