1

我有一些类似的东西:

public HashMap<Boolean, String> map = new HashMap();
map.put(this.inverted, "Inverted");
map.put(this.active, "Loading");
System.out.println(map.size());

在看到大小始终为 1 之后,我意识到使用 map.put 会覆盖以前的数据。我目前正在尝试迭代哈希图。有没有办法在不覆盖以前的映射的情况下向它添加映射?

4

7 回答 7

3

您已将HashMap声明为:-

public HashMap<Boolean, String> map = new HashMap();

现在,想想你的 ? 中可以有多少个最大映射map?你可以通过思考得到答案,你的Boolean类型可以取什么值。这是因为,您不能在HashMap.

所以,可能你现在明白了,你最多只能2 mappings在你的地图中拥有一个,一个用于true,另一个用于false(实际上你也可以有3rd一个,因为你也可以在你的 中拥有一个null键的映射HashMap)。

所以,在你的情况下,如果两者都是this.invertedandthis.activetrueor false。然后其中只有一个可以在那里,那将是后来插入的值。

有没有办法在不覆盖以前的映射的情况下向它添加映射?

可能您错误地构建了HashMap 。您应该将您的地图声明为: -

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

现在您可以将两个映射设置为:-

map.put("Inverted", this.inverted);
map.put("Loading", this.active);
于 2013-01-14T08:30:06.910 回答
1

这是因为this.inverted.equals(this.active)this.inverted.hashcode()==this.active.hashcode()

也许您需要重新定义键的 equals 方法。

于 2013-01-14T08:28:48.023 回答
0

正如@Frank 建议的那样,您应该反转您的地图。

public final Map<String, Boolean> map = new HashMap<>();

map.put("Inverted", this.inverted);
map.put("Loading", this.active);
System.out.println(map);
于 2013-01-14T08:30:16.430 回答
0

如果键与前一个值相同,则在标准 Java Map 中被覆盖。如果你不想要这个,你可以看看在 commons-collections 中实现的 multimap。它可以为一个键保存不同的值。

于 2013-01-14T08:31:25.897 回答
0

Hashmap 基于键/值对。如果您的密钥相等(它们具有相同的哈希码),它将按照您的描述运行。

对于您的用例,反转您的键/值对将对您有所帮助。

public HashMap<String, Boolean> map = new HashMap();
map.put("Inverted", this.inverted); 
map.put("Loading", this.active);
System.out.println(map.size());
于 2013-01-14T08:32:07.783 回答
0

在地图中

将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射到一个值。---> 来自地图 API

从您的实施来看,可能this.inverted并且this.active两者都具有相同的价值。

检查输入一次。打印keySet,然后检查。

或将输入更改为Map<String, Boolean>

于 2013-01-14T08:29:47.217 回答