为问题/答案组实现哈希表

时间:2010-08-14 20:42:21

标签: java dictionary hashtable

实现哈希表(或使用更好的方法)来存储问题列表及其相关答案(每个问题可能有1个答案)的最简单方法是什么?

最初我创建了一个ArrayList来存储问题。我可以为答案制作第二个ArrayList,但是一旦我有很多问题,尝试匹配问题和答案就会变得复杂。

有人可以发布快速代码示例吗?谢谢!

4 个答案:

答案 0 :(得分:4)

你想要钥匙是什么?如果每个问题只有一个可能的答案,并且在某些情况下可能是答案,那么这听起来是Answer类中Question引用的理想原因。然后只需要一个问题列表。

如果不符合某些特定要求,请提供有关您尝试执行的操作的详细信息。 (例如,您可能需要从问题的答案导航...在这种情况下,可以从答案中回复对象中的问题...它有点乱就循环引用而言,并不适用于不可变类型,但这并非完全不合理。)

更喜欢在简单地图上列出问题列表的一个原因是问题倾向于以某种方式自然排序 - 而地图通常是无序的。但我们需要更多地了解您的实际情况,以确定是否相关。

答案 1 :(得分:1)

HashMap是一个完美的选择,但我建议你更进一步。

Java是一种面向对象的语言。为什么不创建问卷抽象?

public class Questionnaire
{
    private Map<String, String> questionsAndAnswers = new HashMap<String, String>();

    // more follows.

}

答案 2 :(得分:0)

对于这个简单的1:1映射,您不一定需要复杂的HashMap。一个由问题及其相关答案组成的简单类就足够了:

public class Question {
   final private String text;
   final private String answer;
   public Question(String text, String answer) {
     this.text= text;
     this.answer = answer;
   }

   public String getText() { return text; }
   public String getAnswer() { return answer; }
   public String toString() { return text + " - " + answer; }
}

然后,在代码的后面,您可以创建一个包含所有问题的列表:

   List<Question> questionnaire = new ArrayList<Question>();
   questionnaire.add(new Question("1+1?", "2"));
   System.out.println("Question 1: " + questionnaire.get(0).getText());

答案 3 :(得分:0)

任何实现 Map 界面(java.util.Map)的类都符合您的基本要求。

但是,在选择实施时,必须考虑要优化的操作: {插入删除随机访问顺序访问}

如果您只需要随机访问每个问题(和答案),那么 HashMap 可能是您最好的选择。

像应用程序这样的字典最常见的用例是列出一系列条目。因此,如果您要显示一系列问题(和答案),请考虑使用HashMap LinkedHashMap 的变体。

您的基本哈希表功能由HashMap提供,它将为查找产生O(1)复杂性,但是显示“系列”或“列表”所需的迭代可能很昂贵。

在这种情况下, LinkedHashMap 最能满足您的需求,因为它提供了一个固定在底层哈希表上的链接列表;因此,迭代或顺序访问变得便宜。然而,这样做的权衡是,这使得新条目(问题)的添加和删除更加昂贵。