将元素添加到包含 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 文件中完全相同的东西,但我得到了


西南:(得分,92);(得分,92);(得分,92)


即使我paMap.get(per).add(att)从 addMap 方法中删除该行,我最终也会得到 SW: (scores, 92);


另外,我已经测试了是否正确调用了 for 循环,并且确实如此。


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


谢谢您的帮助


jeck猫
浏览 117回答 2
2回答

红颜莎娜

几个建议:在Map声明中使用接口:public Map<Permissions, List<Attributes>> paMap;&nbsp;Map为了在确保中用作键Permissions是不可变的,并且具有equals并hashCode正确定义所以,假设Permissions只有 1 个字符串字段,它应该看起来像这样:public final class Permissions {&nbsp; private final String permission;&nbsp; public Permissions(String permission) {&nbsp; &nbsp; this.permission = permission;&nbsp; }&nbsp; public String getPermission() {&nbsp; &nbsp; return this.permission;&nbsp; }&nbsp; @Override&nbsp; public boolean equals(Object o) {&nbsp; &nbsp; if (this == o) {&nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; }&nbsp; &nbsp; if (o == null || getClass() != o.getClass()) {&nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }&nbsp; &nbsp; Permissions that= (Permissions ) o;&nbsp; &nbsp; return Objects.equals(this.permission, that.permission);&nbsp; }&nbsp; @Override&nbsp; public int hashCode() {&nbsp; &nbsp; return Objects.hash(this.permission);&nbsp; }}尝试另一种printMap方法实现。例如,对于 Java 8:&nbsp; private void printMap() {&nbsp; &nbsp; paMap.entrySet().stream().map(this::format).forEach(System.out::println);&nbsp; }&nbsp; private String format(Map.Entry<Permissions, List<Attributes>> entry) {&nbsp; &nbsp; String key = formatPermissions(entry.getKey());&nbsp; &nbsp; String value = formatAttributes(entry.getValue());&nbsp; &nbsp; return String.format("%s: %s", key, value);&nbsp; }&nbsp; private String formatPermissions(Permissions permissions) {&nbsp; &nbsp; return permissions.name;&nbsp; }&nbsp; private String formatAttributes(List<Attributes> attributes) {&nbsp; &nbsp; return attributes.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(attr -> String.format("(%s, %s)", attr.variable, attr.value))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.joining("; "));&nbsp; }

慕慕森

我不知道 read 方法看起来如何,但似乎你一直在添加相同的属性,所以可能在 read 函数中你不是创建新属性而是一直使用相同的对象,只是在这个对象上调用集合,所以在最后的数组 lsit 是同一个对象加了 3 次顺便说一句:方法 addmap 也可以替换为:paMap.computeIfAbsent(per,x->new&nbsp;ArrayList<Attributes>()).add(att);如果您使用的是 java8 及更高版本;)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java