2012-03-25 52 views
3

我很新编程,所以我很抱歉如果这是一个愚蠢的问题。我想知道是否有一种数据返回(可能)每个键的多个答案。例如:产生多个结果的关键

TestType<int,String> test = new TestType<int,String>();

所以,如果你输入,test.getKey(1),你可以得到{ “你好”, “这个”, “是”, “一”, “测试”}。

基本上,有没有一种数据可以返回多个答案,有点像一个HashMap和List结合?

+0

其实这是一个很好的问题。 – 2012-03-25 17:50:59

回答

1

什么你问被称为多重映射,也有Guava几种实现和另外一个在Apache的百科全书collections

+0

出于好奇,因为这种恶意软件经常弹出。为什么要将一个依赖关系引入第三方库只是为了使用单一的数据结构而没有别的? – Cratylus 2012-03-25 17:36:32

+1

@ user384706:熟悉第三方库非常重要 - 您希望实施的许多事情已经存在,并且了解它们总是很好。另外,apache被认为是可靠的第三方,其组件被广泛使用,因此被广泛测试。 – amit 2012-03-25 17:40:21

+0

@amit:我明白你在说什么,但是如果你很容易地引入库,你甚至会得到一个相当大的应用程序,即使对于微不足道的功能也是如此。不知道这是否到处都是相同的情况,但是我的老板不会喜欢额外的4MB lib只是使用1个数据结构 – Cratylus 2012-03-25 17:44:51

5

不在标准Java中。但是,您可以使用Guava MultiMap集合类型。还有其他图书馆也提供多地图集合。

如果由于某种原因您不想使用第三方库,您也可以推出自己的数据结构。然而,它肯定会重新发明轮子,这有点痛苦。您可以将test定义为Map<Integer, Set<String>>,然后编写访问方法以在适当的条件下使用空集来初始化密钥条目。

请注意,Java不允许原始类型(例如,您使用的int)用作通用类型参数值。你将不得不使用Integer。由于自动装箱,您仍然可以使用test.get(1)来检索存储在密钥1下的值。

+0

为什么使用'set'而不是'List' – 2012-03-25 17:32:37

+2

@Samir - 当然,它取决于所需的语义。虽然我使用Set,但对于OP的应用来说,列表确实可能更好。如果值的顺序很重要,那么列表将是正确的类型。如果顺序不重要,但多重性很重要,那么Multiset可能更合适。如果既没有秩序也没有多重价值(一个非常普遍的情况),那么一个集合就是最好的匹配。番石榴Multimap使用集合,具有更多特定值集合类型的子接口。 – 2012-03-25 17:45:20

+0

为了澄清,Guava为不同的用例提供了'Multimap'(用于泛型集合),'ListMultimap'和'SetMultimap'子类型。 – 2012-03-25 22:39:18

0

Java不提供multimap,因为它不经常使用(他们的声明)。但是Sun提供了关于如何创建自己使用Map多重映射一个小例子和List如下:

Map<String, List<String>> m = new HashMap<String, List<String>>(); 

您可以在这里Java Collections/Maps看到一个例子。检查multimaps上的段落,例如代码

0

Amit's在正确的轨道上。你也可以为答案创建一个类。这可以帮助你增加封装。

Map<Integer, MyAnswer> 

其中MyAnswer可以包含您希望管理的数据的属性。在这里实施你自己的课程给你一个可能的世界。