亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將元素添加到包含 ArrayList 的 HashMap

將元素添加到包含 ArrayList 的 HashMap

jeck貓 2022-06-23 09:00:47
這個簡單的方法應該將元素添加到 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 printingpublic 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 文件中完全相同的東西,但我得到了西南:(得分,92);(得分,92);(得分,92)即使我paMap.get(per).add(att)從 addMap 方法中刪除該行,我最終也會得到 SW: (scores, 92);另外,我已經測試了是否正確調用了 for 循環,并且確實如此。因此,我對 ArrayList 上的屬性如何更新以及正確的做法感到困惑。您在我添加或打印值的方式中看到任何錯誤嗎?謝謝您的幫助
查看完整描述

2 回答

?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

幾個建議:


在Map聲明中使用接口:

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

Map為了在確保中用作鍵Permissions是不可變的,并且具有equals并hashCode正確定義

所以,假設Permissions只有 1 個字符串字段,它應該看起來像這樣:


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

  }


查看完整回答
反對 回復 2022-06-23
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

我不知道 read 方法看起來如何,但似乎你一直在添加相同的屬性,所以可能在 read 函數中你不是創建新屬性而是一直使用相同的對象,只是在這個對象上調用集合,所以在最后的數組 lsit 是同一個對象加了 3 次

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

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

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


查看完整回答
反對 回復 2022-06-23
  • 2 回答
  • 0 關注
  • 133 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號