需要帮助将项目添加到链接列表数组中

时间:2017-11-03 19:47:04

标签: java arrays linked-list hashtable

我应该从头开始制作Hashtable,它应该是一系列链接列表。我必须创建自己的Linked List类(在我的代码中),以及我自己的列中的项目(DataItem,在代码中)。

我的add(word)功能需要帮助。我应该在使用我的哈希函数找到的索引处将一个DataItem添加到链表的数组中(我可以很好地获得索引)。

我把我的代码放在下面。一切都没有错误,添加方法"工作"但它没有实现我制作的Linked List类。而不是仅仅将dataitem放入每个索引的数组中,我应该放置链表的第一个链接,并将dataitem放在那里。当发生碰撞时(比如当我添加carkcel时),我应该将它添加到链接列表中的下一个链接。我能帮忙解决这个问题吗?我根本不知道如何使用链接列表。

import java.util.*;

public class HashTable{

   private int tableSize = 97;

   //the LinkedList class I made
   public class LinkedList {
      private LinkedList next;  
      private final DataItem word;

      public LinkedList(DataItem word, LinkedList next) {
         this.word = word;
         this.next = next;
      }
   }


   public class DataItem {

      String word;
      int count;        // occurrence count of this word

       public DataItem(String word) {
          this.word = word;
          this.count = 1;
       }

    }



   /*A constructor, which takes no parameters and creates an empty hash table.*/     
   DataItem[] table = new DataItem[97];


   //My hash function.
   public int hash(String word){
   int index = 0;
      for(int i = 0;i < word.length(); i++){
         index += word.charAt(i) - 'a' + 1;     
      }   
      index = (((17 + word.length()) + index) * 17) % tableSize; 
      return index;
   }



   /*This method must search for word in the hash table, if it finds word, 
   it must increment the word’s occurrence count; if it does not find the word, 
   it must insert it into the hash table, giving it an initial occurrence count of 1.*/

   public void add(String word){

      //convert word to all lowercase
      word = word.toLowerCase();
      int index = hash(word);
      System.out.println("adding " + word + " at index " + index);
      DataItem newItem = new DataItem(word);      

      //search for the word at the index location's linked list.


         //if we don't find the word, add it to the beginning of the linked list;
         if(table[index] == null){
            table[index] = newItem;
            System.out.println(table[index]);
            return;
         }


         //if we find the word, increment the word's count. 
         if(table[index] != null){
            if(table[index].word  == word){
               table[index].count += 1;
               System.out.println(table[index]);
               return;
            }


            //if the word at index is different, add the new word to the next link in the linked list
            if(table[index].word != word){
               System.out.println("collision!");
               return;
            }         

         }

   }

当我运行我的测试程序时:

import java.util.*;
public class test {

   public static void main(String[] args) {

      HashTable table = new HashTable();

      table.add("snap");
      table.add("crackle");
      table.add("pop");
      table.add("pop");
      table.add("carkcel");

   }

}

我明白了:

在索引43处添加快照&#39; snap&#39;,1

在指数48处加入裂纹&#39;裂缝&#39;,1

在索引72添加pop&#39; pop&#39;,1

在索引72添加pop&#39; pop&#39;,2

在指数48碰撞时添加carkcel!

1 个答案:

答案 0 :(得分:0)

您正在尝试将值分配给数组索引,而不是将其添加到该数组索引中的链接列表中:好吧,我无法看到您在哪里创建了一个链表列表,但我假设您在表中有链接列表阵列。

       if(table[index] == null){
        table[index] = newItem;
        System.out.println(table[index]);
        return;
        }

你应该像这样调用链表的add方法:

    if(table[index].get() == null){
        table[index].add(newItem);
        System.out.println(table[index]);
        return;
     }

此算法称为单独链接。你可以在这里找到它是如何工作的一本书Kevin Wayne & Robert Sedgewick.你也可以在youtube上找到关于它的视频,这是我推荐你的原因。

以下是在数组中创建链接列表的方法:

 for(int i = 0; i < table.length;i++){
     table[i] = new LinkedList(null,null);
  } 

在此之后,您可以使用索引调用add和get方法。