哈希图中覆盖的值

时间:2019-05-17 13:39:15

标签: java oop instance getter-setter setter

我正在使用HashMap来存储某条消息中对于多条消息(即HashMap<String,ArrayList<TagObject>>)所需的标签列表。每个TagObject都有属性,主要的是在特定消息中是否需要该标签。现在,如果一条消息中需要一个标签,而另一条消息中则不需要,则最终所需的值最终是最后处理的值。我还要创建一个HashMap<String,TagObject>来存储所有已处理的标签。也许是引起问题的原因?我认为问题是同一变量被反复覆盖,如何为每条消息制作单独的副本以存储在消息的主HashMap中?

我查阅了HashMap overridden by last value,但是每次都在创建一个新的字段,所以这似乎不是原因。

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 个答案:

答案 0 :(得分:1)

我想您是将标签错误地添加到了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添加更多信息与向您的HashMap添加新的Map.Entry并不相同。

当然,如果您每次想向Map中添加信息时都创建一个对象的新实例,并使用已经存在的相同键来放置该信息,那么您将覆盖Map中的值。

答案 1 :(得分:0)

找出我真正需要的东西。我想在HashMap中创建一个值的副本,我一直在做的事情是复制对对象的引用,这就是为什么它一直被覆盖的原因。 我真正需要的是一个复制构造函数。 这有助于:https://stackoverflow.com/a/33547834/1677804