0

我需要一个双表,从中我可以从键或索引中获取两个值。我已经看到了这个问题,我想知道考虑到性能,什么是更好的方法。

1)以这种方式创建一个HashMap:

HashMap<Integer, HashMap<String, String>> = ...;

我不知道如何将值放在这个 put 方法中,我有这个,Eclipse 给了我一个错误prueba.put(0, new Hashtable<"Hi", "Bye">);正如你所见,在我确定这是一个简单的问题之前,我从未使用过这样的东西。

2)以这种方式创建一个HashMap:

HashMap<Integer, YourFancyDatatype>

因此,我创建了一个类,该类将我希望在一个对象中包含的两个或多个值包含在单个键或索引中。

哪个会表现更好?另外,如果您可以帮助我了解如何使用数字 1) 方法。HashMap 将有大约 20000 个条目。

非常感谢您的时间和帮助:)

4

5 回答 5

3

你会想要一个只有一个键和一组值的东西。我建议使用Apache 的 MultiMap,因为他们已经为你实现了这个功能。

于 2012-12-16T18:26:09.960 回答
1

您的第一种方法使用与 Guava 的HashBasedTable提供的相同数据结构,因此您可以使用它。

但是如果你想要最好的性能,你可以尝试使用基于数组的东西(例如 Guava 的ArrayTable

无论如何,我建议进行一些简单的性能测试,以检查哪种解决方案性能更好。

于 2012-12-16T18:38:23.230 回答
0

如果你想做一个“在线”放置,你可以这样做:

prueba.put(0, new HashMap<String, String>() {{put("Hi", "Bye");}});

这使用了 HashMap 的匿名子类,该子类具有加载值的实例块。


请注意,这将为 JVM 创建一个额外的类(称为 MyClass$1 或类似名称)。

于 2012-12-16T18:24:00.193 回答
0

我不知道如何在 put 方法中放入值,我有这个,Eclipse 给了我一个错误 prueba.put(0, new Hashtable<"Hi", "Bye">); 如您所见,在我确定这是一个简单的问题之前,我从未使用过这样的东西。

首先,Hashtable<String, String>不是 的子类型HashMap<String,String>。您的 HashMap 需要 aHashMap<String, String>作为值。将 hashmap 插入值或将 hashmap 声明更改为:

HashMap<Integer, ? extends Map<String, String>> = ...;

但是您的第二种方法更加面向对象。所以我建议使用第二种方法

于 2012-12-16T18:25:34.050 回答
0

在这种情况下,第二个可能会更容易

HashMap<Integer, HashMap<String, FancyDataType>> h= ...;

这就是您必须插入数据的方式

 h=HashMap<Integer, FancyDataType>     new Hashtable<Integer,FancyDataType>();
numbers.put(0, new FancyDataType("o","x"));
numbers.put(1, new FancyDataType("t","y"));
numbers.put(1, new FancyDataType("q","z"));
/// ...so one for all 20000

假设 FancyDataType 类似于

class FancyDataType{
  String k,v;
  FancyDataType(String k,String v){
      this.k=k;this.v=v;

   }

} 
于 2012-12-16T18:25:44.990 回答