2012-02-07 84 views
0

我经常遇到的场景,而在Java中使用的HashMap如下:

我有A类的对象的列表(List<A>
A有田诠释F1,F2 INT等领域。重点在HashMap中的Java

我必须从List构造一个映射来执行O(1)查找A的对象。关键是f1和f2(都是整数)的组合。

现在其下面的将是为在地图
壳体1使用最好的做法:在一般
壳体2:F2只能取2〜3个不同的值,而F1可以采取大数目的值。

Map<Integer, Map<Integer, List<A>>> // construction of map is cumbersome 
Map<String, List<A>>     //(key : String f1 + "_" + f2) 
Map<Integer, List<A>>   //(I tend to use this for case 2) 

错过了澄清这里的一件事。 f1和f2不能唯一标识A的对象。更正了映射定义。

+0

这三个都是不错的选择。使用哪一个取决于你的具体情况。 – Borealid 2012-02-07 05:44:50

回答

0

如果这两个领域往往是不可变的(它们不会改变一旦设置),可以覆盖A的equals()hashCode()方法,并简单地存储:

Set<A> //(key: fields f1 and f2, via hashCode() method) 

如果他们并非一成不变,无论如何你都不能使用它们,因为它们可能会改变。

0

我认为地图适用于情况1,对于案例,我推荐列表,并且此列表只有2-3个元素,那么您可以将索引映射到特定的字段值。

0

为什么要使用地图?如果您不需要键值对,则可以使用HashSet<A>。查找仍然是O(1),您不必费心从密钥中获取值。

当然,HashSet可能只是一个空值的HashMap,但您不必发明键和值。

0

我不喜欢使用字符串作为组合键。有些博客写得很好:字符串对文本是有好处的,对于不是文本的东西不好。

为什么不创建一个简单的IntPair类有两个int领域,并适当hashCode()equals(Object)覆盖?它会在IDE中花费你两秒钟的时间(没有更长的时间),并且你将拥有更具体的,语义上有意义的密钥类型。

-1

关键是独特的HashMap的......因为在Java内部的关键是用Java

这就是为什么关键是唯一不会允许重复设置为

final Key 

INT静态项类。 ..