来自具有单链接列表哈希表的Set类的Output()

时间:2015-03-07 05:56:11

标签: java set hashtable singly-linked-list

我有代码,我现在已经工作了10个小时,而对于我的生活,我无法获得我的Set.java的输出()。不幸的是,我不允许从java库中导入Iterator或HashTable类。任何想法或建议都会有所帮助。

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();
  }
}

这是我一直在研究的课程:

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();
  }
}

3 个答案:

答案 0 :(得分:0)

在你的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();
}

答案 1 :(得分:0)

所以将输出()稍微改为

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

它仍然只打印&#34;由Tony&#34;编程 和&#34;第1集的内容:&#34; &#34;第2集的内容:&#34;没有实际的设定数据?

答案 2 :(得分:0)

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

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