【问题标题】:Access an ArrayList inside a Java Map访问 Java Map 中的 ArrayList
【发布时间】:2013-12-14 22:03:26
【问题描述】:

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

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

在某一时刻,我们需要创建和维护一个 Map(key, value)。 但是,我们需要使用 ArrayList(String) 作为 Map 的值。

添加到这个地图看起来很容易: 只需检查有问题的 Map 是否还没有包含指定的键,然后创建数组并填充其值并“放置”它,并将键 String 放到 Map 中。

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?
  }
}

但是如果我想编辑那个数组的内容呢? 我今天才刚开始看 Maps,所以我对他们有点陌生,但我看到他们有一个“put”方法 - 我明白 put、pop 和 push 通常是做什么的,所以这有点熟悉. 我是否必须将数组的内容复制到一个新的临时数组中,删除()旧的“key => value”对并使用附加数据创建一个新数组?

非常感谢您的帮助! :D

【问题讨论】:

  • 那不是数组。这是一个ArrayList。您的作业实际上是关于数组,还是关于一般的集合?
  • 你只需要map.get(key).add(element)
  • @JonSkeet :对不起,如果我让你感到困惑。是的,我确实知道数组和数组列表之间的基本区别。我使用的是通用英语术语'collection of things',恰好是“array”。但无论如何,我现在已经更新了我的术语。
  • @MarkoTopolnik 你违反了LoD
  • @tintinmj 我想你不太明白我在说什么。

标签: java arrays data-structures map arraylist


【解决方案1】:

来自Map.#put的Javadoc

将指定值与此映射中的指定键相关联 (可选操作)。 如果地图之前包含 键,旧值被指定值替换。 (地图 m 是 当且仅当 m.containsKey(k) 将返回 true。)

所以你可以看到,如果你修改你的array,你不需要删除这对。只需将其与上一个键重新映射即可。

您的代码中存在语法错误。您不能实例化接口。所以你的代码应该是

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

TreeMapMap 接口的任何直接具体子类。

【讨论】:

  • 更新了我的错误 - 感谢您发现它!所以我只需要获取 ArrayList 的引用,更新它并做一个新的 .put() ?
  • 是的。获取ArrayListkey 值,然后更新ArrayList 并简单地重新映射它。
  • @CindyStarfall 不,你不需要一个新的.put(如果你这样做,它就等于没有操作)。您需要更新感兴趣的arraylist。
  • @CindyStarfall 是的,除非您重新引用您的数组列表,否则您不需要新的 .put
  • 什么是“重新引用”?这不是标准术语。
【解决方案2】:

您的Map 包含对ArrayLists 的引用。

String key = "some list name";
// This assumes this entry is in the map; doesn't check for null
ArrayList<String> listInMap = map.get(key);
listInMap.add("new thing to add to list");

当您使用Map.get() 时,它会返回对映射中ArrayList 的引用,而不是它的副本。然后,您可以通过返回的引用修改 List

【讨论】:

  • 我明白了!谢谢!所以 Map 的 getter 给了我一个参考,当我用那个参考做一些事情时(比如添加一个额外的元素),它会更新它在 Map 中保存的内存位置?那么我什至需要对该地图的指定索引做更多的事情吗?或者只是使用引用编辑对象?
  • 您正在处理引用(指针)。 ArrayList 是堆上的一个对象。对该对象的任何引用都可以用来改变它。上面的代码是您修改地图所包含引用的ArrayList 所需的全部内容。
【解决方案3】:

要编辑一个特定 arrayList 的内容,您首先需要从地图中获取它,然后从数组中添加/删除:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多