2016-04-21 125 views
1

例如,是它总体上是好的有如下的结构:在java中使用映射作为值的映射是“好”吗?

Map <Object, Map> 

在我的情况,乍一看我需要某种结构,将有例如映射String -> Map<...>这很奇怪,我应该以其他方式解决问题?

+1

取决于你的用例。它不一定是错的。 – khelwood

+0

任何地方都可以使用[原始类型](https://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html)。至少,使它成为'Map >'。 –

+0

我不问行类型,而是关于有一个地图作为价值。 使用案例:我有一些开关,例如JComboBox,我需要一个单独的地图关联到列表中的每个对象,所以如果我选择一些相应的地图将被使用。 –

回答

2

以这种方式设计数据结构本身并不好。这也不一定是坏事。

如果您要查找地图对象,我会考虑使用HashMap来提高执行时间。

来自@Rafael Osipov,在涉及并发性的情况下,考虑使用ConcurrentHashMap来实现数据完整性。

+0

这个'HashMap'提示是什么?这完全不相关,可能“不好”...... – Marco13

+0

其实HashMap是一个Map的非标准实现。在实践项目中,你几乎看不到别的东西。是的,问题不是关于它的 –

+0

如果实现涉及并发性,请考虑在HashMap上使用'ConcurrentHashMap'来获得性能增益。 – 2016-04-21 12:59:51

0

将地图作为地图中的值没有什么不对。这是使用多个键快速查找的一种相当常见的方式。

例如,你存储大量的Student记录:

class Student 
    private String name; 
    private int age; 
    private School school; 
} 

您可以将这些存储在List<Student>,但如果你想找到,比如,所有的学生在一定的学校谁16岁老它可能是更好的能说:

Map<School,Map<Integer,List<Student>>> index; 
List<Student> subset = index.get(School.STATE_HIGH).get(16); 

注意,有诸如具有独立的复合键类型(在我上面的例子,代表学校和年龄一起)做同样的事情的其他方式。另外请记住,如果您使用地图的主要目的是效率,那么在很多情况下,您可能会过早地进行优化。除非地图存储了数百万个值,否则你将每秒访问它们几千次,那么你可能需要考虑一个简单的列表,你可以通过它来搜索。

2

它有几个代码味道对我来说。

  1. 内部Map没有指定通用类型。
  2. 它说你需要做两次查找。我更喜欢在拼合地图上使用复合键和单个查找。
  3. 添加到此结构中必须过于复杂。
  4. 关键是object,不是强类型。

所以我宁愿看到:

Map<CompositeKey, ValueType> 

哪里CompositeKey是由第一和第二项的正确实施的平等一类。和ValueType不是Map

因此,例如,代替嵌套地图:

A -> { 1 -> "ABC", 
     2 -> "DEF"}, 
B -> { 1 -> "abc", 
     3 -> "def"} 

你有一个平坦的地图和一个复合键:

(A,1) -> "ABC", 
(A,2) -> "DEF", 
(B,1) -> "abc", 
(B,3) -> "def",