Reputation: 619
i am trying to implement hash set which will store Word objects but when i add more than one word object to it, it gives me always the size 1, i dont really know where the problem here is some part of my code:
public class HashWordSet implements WordSet{
private Node[] buckets = new Node[8];
private int size=0;
private class Node{
Word value;
Node next = null;
Node prev = null;
public Node (Word word){
value = word;
}
}
private int getBucketNumber(Word word){
int hash = word.hashCode();
if(hash<0){
hash = -hash;
}
return hash%buckets.length;
}
private void rehash(){
Node[] temp = buckets;
buckets = new Node[2*temp.length];
size = 0;
for (Node n : temp){
while (n != null){
add(n.value);
n = n.next;
}
}
}
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public void add(Word word) {
int pos = getBucketNumber(word);
Node node = buckets[pos];
while(node != null){
if(node.value.equals(word))
return;
else
node = node.next;
}
node = new Node(word);
node.next = buckets[pos];
buckets[pos] = node;
size++;
if(size == buckets.length)
rehash();
}
@Override
public boolean contains(Word word) {
// TODO Auto-generated method stub
return false;
}
@Override
public int size() {
return size;
}
public String toString() {
StringBuffer buf = new StringBuffer();
for (int i=0;i<buckets.length;i++) {
Node node = buckets[i];
if (node == null) continue;
buf.append("Bucket "+i+":");
while (node != null) {
buf.append(" "+node.value);
node = node.next;
}
buf.append("\n");
}
return buf.toString();
}
}
Upvotes: 1
Views: 619
Reputation: 5661
These lines from rehash()
seem to be wrong:
for (Node n : temp){
if (n == null){ //WRONG?!
while (n != null){
add(n.value);
n = n.next;
}
}
}
You work with nulls only...
Upvotes: 1
Reputation: 3414
Looks like you have a logic SNAFU here. You'll never get into your while loop. I don't have enough code here to determine if this is the only problem you have, but removing the if check will certainly help.
if (n == null){ // remove this
while (n != null){
add(n.value);
n = n.next;
}
}
Upvotes: 3