[英]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
不可變並且具有equals
和hashCode
正確定義 因此,假設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.