Java中的双表

时间:2012-12-16 18:17:40

标签: java hashmap

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

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

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

我不知道如何在put方法中放置值,我有这个,Eclipse给了我一个错误prueba.put(0, new Hashtable<"Hi", "Bye">);正如你所看到的,我从来没有使用过这样的东西,我确信它是一个简单的问题

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

HashMap<Integer, YourFancyDatatype>

所以我创建了一个类,它将我希望在一个Object中包含的两个或多个值打包在一个键或索引中。

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

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

5 个答案:

答案 0 :(得分:3)

您需要具有单个键和值集合的内容。我建议使用Apache's MultiMap,因为他们已经为您实现了此功能。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

你想做一个“内联”放,你可以这样做:

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

它使用了一个HashMap的匿名子类,它有一个加载值的实例块。


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

答案 3 :(得分:0)

  

我不知道如何在put方法中放置值,我有这个   和Eclipse给了我一个错误prueba.put(0,new Hashtable&lt;“Hi”,   “再见” &GT);正如你所看到的,在我之前我从未使用过类似的东西   我确定这是一个简单的问题。

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

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

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

答案 4 :(得分: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;

   }

}