Значение переопределено в hashmap - PullRequest
0 голосов
/ 17 мая 2019

Я использую HashMap для хранения списка тегов, которые требуются в определенном сообщении, для нескольких сообщений, то есть HashMap<String,ArrayList<TagObject>>.У каждого TagObject есть атрибуты, основной из которых - является ли этот тег обязательным или нет в определенном сообщении.Теперь, если тег требуется в одном сообщении, а не в другом, окончательное требуемое значение заканчивается тем, которое было обработано последним.Я также создаю HashMap<String,TagObject> для хранения всех обработанных тегов.Может быть, это является причиной проблемы?Я думаю, что проблема заключается в том, что одна и та же переменная неоднократно переопределяется, как мне сделать отдельные копии для каждого сообщения для хранения в основной HashMap сообщений?

Я посмотрел HashMap, переопределенный последним значением , но я создаю новое поле каждый раз, так что это не является причиной.

for(TagObject o:allTags) {
    if(o instanceof Field){
        fieldResult=new Field();
        Field field = (Field) o;
        String required=field.getRequired(); //this is the value found in the file where the specifications are, ie whether the field should be required or no in this message. this value is received correctly
        if(required == null || required.equalsIgnoreCase("yes")) {
            required="true";
        }else{
            required="false";
        }
        else {
            fieldResult=ctd.searchFieldMap(field.name); //find the already created Field object
            fieldResult.setRequired(required); //set the required now as got from the specifications
        }
        fieldsInMessage.add(fieldResult); //add this field to list of fields to be there in the message
        //while being added, I can see the value of the required tag go as in the specs, however when I later print the hashmap of all messages, the tag which was required in one message, but set as not required in another, has changed value to the value of required of the last appearance of the field in the specifications
    }
}

Я надеялся, что для каждого сообщения будет создана новая копия поля, но похоже, что один и тот же объект используется во всех.Как убедиться, что каждое сообщение может иметь отдельную копию тега и, следовательно, уникальные атрибуты?

Ответы [ 2 ]

1 голос
/ 17 мая 2019

Я полагаю, что вы неправильно добавляете теги в HashMap.

Например, если бы я хотел создать структуру с сообщениями и тегами, я бы сделал следующий фрагмент:

public static void main(String[] args) {
    MessageTagsMap map = new MessageTagsMap();

    map.addNewMessage("Hello World!", "Snippet");
    map.addNewMessage("StackOverflow", "Webpage", "Interesting");

    map.paintMap();

    map.addTagsToMessage("Hello World!", "Deprecated");

    map.paintMap();

}

public class MessageTagsMap {

    HashMap<String, ArrayList<String>> content;

    public MessageTagsMap() {
        content = new HashMap<>();
    }

    void addNewMessage(String message, String... tags) {
        ArrayList<String> messageTags = new ArrayList<>();
        for (String tag : tags) {
            messageTags.add(tag);
        }
        this.content.put(message, messageTags);
    }

    void addTagsToMessage(String message, String... tags) {
        ArrayList<String> messageTags = this.content.get(message);
        for (String tag : tags) {
            messageTags.add(tag);
        }
    }

    void paintMap() {
        for (Map.Entry<String, ArrayList<String>> entry : content.entrySet()) {
            System.out.print("Message: " + entry.getKey() + " tags: {");
            for (String tag : entry.getValue()) {
                System.out.print(tag + " ");
            }
            System.out.println("}");
        }
    }

}

Как видите, добавить новую информацию к предыдущей Map.Entry - это не то же самое, что добавить новую Map.Entry в вашу HashMap.

Конечно, если вы создаете новуюкаждый раз, когда вы хотите добавить информацию на свою карту, и вы помещаете эту информацию в тот же ключ, который уже существует, вы переопределяете значение на карте.

0 голосов
/ 22 мая 2019

Разобрался, что мне действительно нужно. Я хотел создать копию значения в HashMap, то, что я делал, копировало ссылку на объект, поэтому он продолжал переопределяться. Что мне действительно было нужно, так это конструктор копирования. Это помогло: https://stackoverflow.com/a/33547834/1677804

...