向包含ArrayList的HashMap中添加元素

时间:2019-02-17 00:15:30

标签: java arraylist hashmap

该简单方法应该将元素添加到HashMap中。元素是从txt文件中读取的,我已经测试过了,关于该区域的所有内容都工作正常。问题出在我打印地图中的值时。因此,我认为添加它们时可能会出现问题。

txt文件的内容为

SW: (scores, 90); (scores, 91); (scores, 92);

其中“权限”为“ SW”,而“属性”为“(分数90)...(分数92)”。这些是以下方法中使用的元素。

public Map<Permissions, ArrayList<Attributes>> paMap; 

public void addMap(Permissions per, Attributes att) {
    if(paMap.containsKey(per)) {
        paMap.get(per).add(att);            
    }
    else{
        ArrayList<Attributes> attList = new ArrayList<Attributes>();
        attList.add(att);
        paMap.put(per, attList);
    }
}

 //Attributes contain variables (Scores) and values(90-93), that is just for printing

public void printMap() {
    ArrayList<Attributes> list;

    for(Permissions p: paMap.keySet()) {
        list = paMap.get(p);
        System.out.print(p.name + ": ");

        for(Attributes l: list) {
            System.out.print("<" + l.variable +", " + l.value + ">; ");
        }
        System.out.println();
    }

当我打印地图时,我希望得到与txt文件完全相同的东西,但是我得到

SW :(得分92); (得分92); (得分92)

即使我从addMap方法中删除了paMap.get(per).add(att)行,我最终还是得到了SW :(分数92);

此外,我测试了是否正确调用了for循环。

因此,我对ArrayList上的属性如何更新以及正确的做法感到困惑。您在添加或打印值的方式中是否看到任何错误?

谢谢您的帮助

2 个答案:

答案 0 :(得分:0)

我不知道读取方法看起来如何,但是好像您一直在添加相同的属性,所以也许在读取函数中您不是在创建新属性而是一直在使用相同的对象,而只是在此调用集,所以在数组lsit的末尾是同一对象被添加了三遍

顺便说一句: 方法addmap也可以替换为:

paMap.computeIfAbsent(per,x->new ArrayList<Attributes>()).add(att);

如果您使用的是Java8及更高版本;)

答案 1 :(得分:0)

建议对

  • Map声明中使用接口:
public Map<Permissions, List<Attributes>> paMap; 
  • 为了用作Map中的密钥,请确保Permissions是 不可变,并已正确定义equalshashCode

因此,假设Permissions仅具有1个String字段,它应该看起来像这样:

public final class Permissions {
  private final String permission;
  public Permissions(String permission) {
    this.permission = permission;
  }
  public String getPermission() {
    return this.permission;
  }
  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    Permissions that= (Permissions ) o;
    return Objects.equals(this.permission, that.permission);
  }
  @Override
  public int hashCode() {
    return Objects.hash(this.permission);
  }
}
  • 尝试另一种printMap方法的实现。例如,使用Java 8:
  private void printMap() {
    paMap.entrySet().stream().map(this::format).forEach(System.out::println);
  }
  private String format(Map.Entry<Permissions, List<Attributes>> entry) {
    String key = formatPermissions(entry.getKey());
    String value = formatAttributes(entry.getValue());
    return String.format("%s: %s", key, value);
  }
  private String formatPermissions(Permissions permissions) {
    return permissions.name;
  }
  private String formatAttributes(List<Attributes> attributes) {
    return attributes.stream()
            .map(attr -> String.format("(%s, %s)", attr.variable, attr.value))
            .collect(Collectors.joining("; "));
  }