簡體   English   中英

向包含ArrayList的HashMap中添加元素

[英]Add elements to a HashMap containing an ArrayList

該簡單方法應該將元素添加到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的屬性以及正確的方法感到困惑。 您在添加或打印值的方式中是否看到任何錯誤?

謝謝您的幫助

我不知道讀取方法看起來如何,但是好像您一直在添加相同的屬性,所以也許在讀取函數中您不是在創建新屬性,而是一直使用相同的對象,並且僅對此進行調用,所以在末尾的數組lsit是同一個對象添加了3次

順便說一句:方法addmap也可以替換為:

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

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

幾個建議:

  • 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("; "));
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM