访问Java映射中的ArrayList

访问Java映射中的ArrayList,java,arrays,data-structures,map,arraylist,Java,Arrays,Data Structures,Map,Arraylist,这是我在这个网站上发布的第一个问题 在大学Java作业的最后一部分,我的班级被要求展示我们理解如何使用不同类型的数组 在某一点上,我们需要创建并维护一个Mapkey值。 但是,我们需要使用ArrayListString作为映射的值 添加到此地图似乎很容易: 只需检查所讨论的映射是否尚未包含指定的键,然后使用填充的值创建数组,并使用映射的键字符串“放置”它 private Map<String, ArrayList<String>> map = new HashMap<

这是我在这个网站上发布的第一个问题

在大学Java作业的最后一部分,我的班级被要求展示我们理解如何使用不同类型的数组

在某一点上,我们需要创建并维护一个Mapkey值。 但是,我们需要使用ArrayListString作为映射的值

添加到此地图似乎很容易: 只需检查所讨论的映射是否尚未包含指定的键,然后使用填充的值创建数组,并使用映射的键字符串“放置”它

private Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();

public void addToMap(String key, String value) {
  if (!this.map.containsKey(key) {
    ArrayList<String> array = new ArrayList<String>();
    array.add(value);
    this.map.put(key, array);
  }
  else {
    this.map.get(key).add(value); // Does this add a new item to the current ArrayList?
  }
}
但是如果我想编辑该数组的内容呢? 我今天才刚开始看地图,所以我对它们有点陌生,但我看到它们有一种“put”方法——我知道put、pop和push通常用于什么,所以这有点熟悉。 我是否必须将数组的内容复制到一个新的临时数组中,删除旧的key=>value对,并使用额外的数据创建一个新的数组

非常感谢你的帮助!:D

您的地图包含对ArrayList的引用


使用Map.get时,它返回对映射中ArrayList的引用,而不是其副本。然后可以通过返回的引用修改该列表

要编辑一个特定arrayList的内容,首先需要从映射中获取它,然后只需从数组中添加/删除即可:

ArrayList<String> list = map.get("key");
list.get(index);
list.add("something");
来自

将指定值与此映射中的指定键相关联 可选操作。如果映射以前包含的映射 键时,旧值将替换为指定的值。一张地图是m 称为包含密钥k的映射当且仅当m.containsKeyk 将返回真值

因此,您可以看到,如果修改数组,则不需要删除该对。只需使用上一个键重新映射即可

代码中有一个语法错误。不能实例化接口。所以你的代码应该是

private Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();

或者TreeMap或Map接口的任何直接具体子类。

那不是数组。这是一个ArrayList。你们的作业实际上是关于数组的,还是关于集合的?你们只需要做map.getkey.addelement。@JonSkeet:对不起,我把你们弄糊涂了。是的,我确实知道数组和数组列表之间的基本区别。我用的是一般英语术语“事物的集合”,恰巧是数组。但无论如何,我现在已经更新了我的术语。@MarkoTopolnik你违反了。@tintinmj我想你不太明白我在说什么。更新了我的错误-谢谢你发现了!所以我只需要得到ArrayList的引用,更新它,然后做一个新的。put?是的。获取ArrayList值的键,然后更新ArrayList并简单地重新映射它。@CindyStarfall不,您不需要新的。put如果这样做,就等于不操作。您只需要更新感兴趣的ArrayList。@CindyStarfall是,除非您正在引用ArrayList,否则您不需要新的。put。您引用的是什么?这不是标准术语,我明白!谢谢所以映射的getter给了我一个引用,当我用这个引用做一些事情,比如添加一个额外的元素时,它会更新内存中它在映射中的位置?那么,我甚至需要对该映射的指定索引做更多的操作吗?或者只是用引用编辑对象?您正在处理引用指针。ArrayList是堆上的一个对象。对该对象的任何引用都可以用于对其进行变异。上面的代码就是修改映射包含引用的ArrayList所需的全部代码。
private Map<String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();