【问题标题】:Define a recursive definition of a HashMap using generics使用泛型定义 HashMap 的递归定义
【发布时间】:2016-03-11 22:28:42
【问题描述】:

有没有办法在没有警告的情况下定义一个 HashMap 有另一个 HashMap 作为值?
我的意思是,如果我使用泛型,我必须定义:

HashMap<Integer, HashMap<Integer, HashMap<Integer, HashMap<Integer,HashMap etc>> map = new HashMap<>();  

通过以下方式是正确/唯一的方法吗?

HashMap<Integer, HashMap> map = new HashMap<Integer, HashMap>();  

基于 cmets 的更新:
我只是在审查泛型,我的印象是,将哈希图作为另一个哈希图的值并不少见。

根据@JimGarrison 评论更新:
使用散列的散列在其他语言中是一种非常常见的结构,所以我很惊讶我需要实际给出一些特定的用例才能使我的问题有意义。如果我需要给出一个可以使用的真实示例,例如浏览一些层次结构。所以我们可以“模仿”一棵树。

【问题讨论】:

  • 真正的问题是为什么你有一个 Map of a Map of a Map.
  • 为什么要以这种方式分层哈希图?为什么不把一个充满整数的对象(定义了相关的equalshashCode 方法)作为单个hashmap 的键?
  • 除了 Tunaki 正确所说的:你知道内部哈希图应该存储什么值吗?现在主要问题是你最内部的 HashMap 没有指定的数据类型应该存储在其中(它是原始类型),这意味着你总是会收到编译警告。您可以使用像 HashMap&lt;?,?&gt; 这样的通配符来消除该警告,但这也会阻止您操纵该地图。
  • @Pshemo:是的。 Integer 是 Hashmap 的 key 和 value 相同类型。 IE。形成一个“递归”
  • @Tunaki:不是图图图图。它是一个 hashmap 作为另一个 hashmap 的值。我认为泛型使事情复杂化

标签: java generics data-structures hashmap


【解决方案1】:

您可能会发现F-bound types 很有用,至少从理论上来说是这样。在您的情况下,这可能是:

class FBoundedMap<K> extends HashMap<K, FBoundedMap<K>> {
}

那么你可以这样使用它:

FBoundedMap<Integer> map = new FBoundedMap<>();

FBoundedMap<Integer> inner1 = new FBoundedMap<>();
map.put(1, inner1);

FBoundedMap<Integer> inner2 = new FBoundedMap<>();
map.put(2, inner2);

FBoundedMap<Integer> innerMost1 = new FBoundedMap<>();
inner1.put(11, innerMost1);

FBoundedMap<Integer> innerMost2 = new FBoundedMap<>();
inner2.put(22, innerMost2);

System.out.println(map); // {1={11={}}, 2={22={}}}

您只能在最后存储空地图,在中间存储地图地图,所以我看到的唯一实际用途是将数据存储在键中(在这种情况下,这些将是 Integers)和使用这些值来保持对树结构的子节点的引用。

另一种方法是让值是任何类型,包括HashMap。这样,您可以将地图存储为其他地图的值。在这种情况下,您需要将地图声明为:

Map<Integer, Object> map = new HashMap<>();

Map<Integer, Object> inner1 = new HashMap<>();
map.put(1, inner1);

Map<Integer, Object> inner2 = new HashMap<>();
map.put(2, inner2);

Map<Integer, Object> innerMost1 = new HashMap<>();
inner1.put(11, innerMost1);

Map<Integer, Object> innerMost2 = new HashMap<>();
inner2.put(22, innerMost2);

System.out.println(map); // {1={11={}}, 2={22={}}}

当然,如果你需要获取一个值,你需要强制转换:

Map<Integer, Object> value = (Map<Integer, Object>) map.get(1);
System.out.println(value); // {11={}}

【讨论】:

  • @Jim 已编辑,感谢您让我知道问题中的更新。
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2020-10-18
  • 1970-01-01
相关资源
最近更新 更多