2013-07-09 2 views
0

У меня есть класс, который должен создать хеш-таблицу со связанным списком для значений. Если ключ новый, он создает связанный список, и если он уже существует, он должен добавить его в конец списка. По какой-то причине, когда я использую addLast(), он заменяет содержимое моего списка. Вы видите, что я делаю неправильно? Вот мой код. Спасибо!Почему addLast() в Java заменяет мой связанный список?

import java.util.*; 

public class Semantic { 
    String currentScope; 
    Stack theStack = new Stack(); 
    HashMap<String, LinkedList> SymbolTable= new HashMap<String, LinkedList>(); 


    public boolean insertSymbol(String key, SymbolTableItem value){ 
     LinkedList<SymbolTableItem> temp = new LinkedList<SymbolTableItem>(); 
     SymbolTableItem obj; 
     if(!isContained(SymbolTable.get(key), value)){ 
      if(SymbolTable.get(key) != null){ 
       temp = SymbolTable.get(key); 
      } 
      temp.addLast(value); 
      SymbolTable.put(key, temp); 
      return true; 
     } 
     return false; 
    } 

    public boolean isContained(LinkedList list, SymbolTableItem obj){ 
     if(list == null) return false; 
     while(!list.isEmpty()){ 
      SymbolTableItem item; 
      item = (SymbolTableItem) list.removeFirst(); 
      if(item.equals(obj)) 
       return true; 
     } 
     return false; 
    } 

    public String printValues(){ 
     return SymbolTable.toString(); 
    } 

    public boolean isBoolean(){ 
     return true; 
    } 

    public boolean isTypeMatching(){ 
     return true; 
    } 

    public void stackPush(String theString){ 
     theStack.add(theString); 
    } 

} 
+0

Вы должны параметризовать свой 'LinkedList' соответствующим образом, это может сделать вашу жизнь проще. – arshajii

+0

Вы имеете в виду, по-другому, что в том числе класс Linked в декларации? Не могли бы вы привести мне пример? – bstrong

+0

у вас много проблем ... используйте 'contains' вместо' get (key) ', потому что HashTable не принимает значение null, и вам не нужно добавлять его снова при изменении связанногоList – nachokk

ответ

3

Метод isContained удаляет каждый элемент вплоть до элемента поиска SymbolTableItemobj.

Если obj встречается последним в LinkedList, тогда все будет удалено.

+0

Спасибо, я не понимал, что они остаются на связи. – bstrong

+0

reimeus, как вы могли сказать, что у него много проблем в его коде, а не на этом .. :) – nachokk

0

Похоже, вы создаете новый связанный список, прежде чем тестируете, является ли это значение новым или нет. Не пытайтесь создать связанный список, пока не попытаетесь извлечь это значение.

+1

Я не думаю, что если это проблема, у него есть. Вы его протестировали? проблема заключается в 'item = (SymbolTableItem) list.removeFirst();' – nachokk

1

Check around item = (SymbolTableItem) list.removeFirst();
Метод isContained выглядит испорченным.

Смежные вопросы