проблема получения значения из HashMap - PullRequest
1 голос
/ 21 сентября 2011

Привет всем Я использую HashMap, чтобы держать один из моих объектов с ключом строки. когда я помещаю объект с ключом, у него нет проблем, когда я помещаю второй объект, я добавляю свой объект, но не могу получить его с его ключом. В некоторой степени это идет куда-то, что является "следующим". Я сделал скриншот из режима отладки (затмение) ниже

enter image description here

, хотя размер показывает 2, я не вижу свой второй элемент в hashmap, но в следующем узле другого hashmap.

Чтобы заметить что-то, я использую свой ключ, например, в форме «name.tag», тэг и имя в одно и то же время никогда не могут быть одинаковыми, но «тэг» может быть одинаковым. hashmap как-то связан с оператором точки при оценке ключей? Я надеюсь, что смог бы написать ясно,

Заранее спасибо

Edit: Вот фрагмент кода, который я использую для создания своей хэш-карты

        private HashMap<String,ParameterItem> parseParametersNode(DataModel parent,Element element){
        NodeList parameterChilds=element.getChildNodes();//gep element parameters
        HashMap<String, ParameterItem> parameterItems=new HashMap<String, ParameterItem>();
        for(int i=0;i<parameterChilds.getLength();i++){
            if(parameterChilds.item(i).getNodeType()==Node.ELEMENT_NODE){
                Element el=(Element) parameterChilds.item(i);
                NamedNodeMap atts=el.getAttributes();
                ParameterItem item=new ParameterItem();

                for(int j=0;j<atts.getLength();j++){
                    Attr attribute=(Attr) atts.item(j);
                    String attributeValue=attribute.getValue();
                    String attributeName=attribute.getName();
                    item.setParsedProperty(attributeName, attributeValue);
            } /*check  attributes later*/
                //finish loop and insert paramitem to params
                String key="key"+i;
                if(item.getTag()!=null && item.getName()!=null)
                    key=item.getName()+"."+item.getTag();
                parameterItems.put(key, item);
//              testParam=item;
//              parameterItems.put(key, testParam);
                }
        }
        return parameterItems;

    }

Ответы [ 2 ]

2 голосов
/ 21 сентября 2011

Здесь на самом деле нет проблемы: у вас есть коллизия хешей . То есть оба ваших ключа были помещены в одну и ту же корзину. Похоже, у вас есть только четыре сегмента (странно, я думал, что первоначальное значение по умолчанию было 10 или 16), поэтому вероятность этого со случайными данными составляет 25 процентов. Ваш размер увеличился просто отлично. next - это способ внутренней реализации указывать на следующий элемент в том же сегменте . Если количество элементов в каждом сегменте становится слишком большим, Java внутренне перефразирует в большее количество сегментов.

Я не понимаю, зачем вам нужен HashTable, поскольку вы нумеруете свои ключи последовательно (вы можете использовать ArrayList), но, возможно, это просто начальный код, и ваш реальный вариант использования отличается.

2 голосов
/ 21 сентября 2011

У вас есть код:

String key="key"+i;

но сразу после этого вы снова устанавливаете ключ, не добавляя к нему:

if(item.getTag()!=null && item.getName()!=null)
              key=item.getName()+"."+item.getTag();

Если это будет ключ + = item.getName () + "." + Item.getTag ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...