Set class 和单链表哈希 Table 的 Output( )

Output( ) from a Set class with Singly Linked List Hash Table

我的代码现在已经处理了 10 个小时,而且我这辈子都无法使 Set.java 的输出 ( ) 正常工作。不幸的是,我不允许只从 java 库中导入 Iterator 或 HashTable classes。任何想法或建议都会很有帮助。

public class SLL {
  public class Node {
    private int data;
    private Node next;

    public Node() {
        data = 0;
        next = null;
    }

    public Node(int newData, Node linkValue) {
        data = newData;
        next = linkValue;
    }

    public int getData() {
        return data;
    }

    public Node getLink() {
        return next;
    }
  } // End of Node inner class

  private Node head;

  public SLL() {
    head = null;
  }

  public void addToStart(int itemData) {
    head = new Node(itemData, head);
  }

  public boolean contains(int item) {
    return (find(item) != null);
  }

  /**
   * Finds the first node containing the target item, and returns a reference
   * to that node. If target is not in the list, null is returned.
   */
  public Node find(int target) {
    Node position = head;
    int itemAtPosition;
    while (position != null) {
        itemAtPosition = position.data;
        if (itemAtPosition == target) {
            return position;
        }
        position = position.next;
    }
    return null; // target was not found
  }

  public void outputList() {
    Node position = head;
    while (position != null) {
        System.out.print(position.data + "  ");
        position = position.next;
    }
    System.out.println();
  }
}

这是我一直在努力的class:

public class Set {
  private SLL[] hashArray; // DO NOT MODIFY THIS LINE
  private int size = 10; // DO NOT MODIFY THIS LINE

  // DO NOT MODIFY THIS METHOD
  public Set() {
    hashArray = new SLL[size];
  }

  // DO NOT MODIFY THIS METHOD
  private int computeHash(int s) {
    return s % size;
  }

  // COMPLETE BELOW

  public void add(int x)
  {
    int hash = computeHash(x);  // Get hash value
    SLL list = hashArray[hash];
    if(hashArray[hash] == null)
      hashArray[hash] = new SLL();

     else if(!list.contains(x));
     {
       // Only add the target if it's not already
       // on the list.
       hashArray[hash].addToStart(x);
     }

  }

  public void output()
  {
        SLL tmp = new SLL();
        SLL.Node temp = tmp.head;
        for(int i = 0; i < size; i++)
        {
            if(temp == null)
                //I think a new instance needs to be created
            while(temp.getLink() != null)
            {
                System.out.println(i + temp.getData() + toString() + " ");
            }
        }
  }
}

这是它应该使用的测试器:

public class Tester{
  // Have this method to display your name, instead.
  static void displayName(){
    System.out.println("Program written by Tony.\n");
  }

  // DO NOT MODIFY THE MAIN METHOD
  public static void main(String[] args){
    displayName();
    Set set1 = new Set();
    Set set2 = new Set();

    set1.add(3);
    set1.add(3);
    set1.add(13);
    set1.add(23);
    set1.add(4);
    set1.add(5);

    set2.add(15);
    set2.add(6);
    set2.add(6);

    System.out.println("Contents of set 'set1': ");
    set1.output();
    System.out.println("Contents of set 'set2': ");
    set2.output();
    System.out.println();
  }
}

在您的 for 循环中,如下所示:

 if(temp == null)
     //I think a new instance needs to be created
     while(temp.getLink() != null)
     {
         System.out.println(i + temp.getData() + toString() + " ");
     }

您应该检查 temp != null 并且您没有将节点从一个节点移动到另一个节点以遍历每个元素。所以你应该把它改成:

while(temp != null) {
    System.out.println(temp.getData() + " ");
    temp = temp.getLink();
}

因此将输出( ) 稍微更改为

public void output()
    {
        SLL tmp = new SLL();
        SLL.Node temp = tmp.head;
        for (SLL s : hashArray) {
        System.out.println(toString() + " " + s);}
    }

它仍然只打印 "Programmed by Tony" 和 "Contents of set 1:" "Contents of set 2: " 没有实际设置的数据?

您需要遍历哈希数组中的条目,并且对于每个非空条目,遍历链表:

public void output() {
  for (int i = 0; i < hashArray.length; i++) {
    if (hahArray[i] != null) {
      hashArray[i].outputList();
    }
  }
}