Java – 初始化HashMaps的HashMap

我是java的新手,通过创建一个简单的NaiveBayes分类器来练习。 我仍然是对象实例化的新手,并想知道如何初始化HashMaps的HashMap。 在将新观察值插入分类器时,我可以为给定类中的未见特征名创建新的HashMap,但是我是否需要初始化?

import java.util.HashMap; public class NaiveBayes { private HashMap class_counts; private HashMap<String, HashMap> class_feature_counts; public NaiveBayes() { class_counts = new HashMap(); // do I need to initialize class_feature_counts? } public void insert() { // todo // I think I can create new hashmaps on the fly here for class_feature_counts } public String classify() { // stub return ""; } // Naive Scoring: // p( c | f_1, ... f_n) =~ p(c) * p(f_1|c) ... * p(f_n|c) private double get_score(String category, HashMap features) { // stub return 0.0; } public static void main(String[] args) { NaiveBayes bayes = new NaiveBayes(); // todo } } 

请注意,这个问题并不是针对Naive Bayes分类器的,因为我想提供一些上下文。

是的,您需要初始化它。

 class_feature_counts = new HashMap>(); 

如果要向class_feature_counts添加值,还需要实例化它:

 HashMap val = new HashMap(); // Do what you want to do with val class_feature_counts.put("myKey", val); 

递归的通用数据结构,如地图的地图,虽然不是一个彻头彻尾的坏主意,但通常表示你可以重构的东西 – 内部地图通常可以是一阶对象(它包含地图),而不仅仅是地图。 您仍然需要初始化这些内部对象,但它通常是一种更清晰,更清晰的开发方式。

例如,如果你有一个Map>你经常会存储A到Thing的地图,但是存储Thing的方式恰好是一张地图。 你经常会发现它更清晰,更容易隐藏Thing是一个地图的事实,而是存储Map的映射,其中thing被定义为:

 public class Thing { // Map is guaranteed to be initialized if a Thing exists private Map data = new Map(); // operations on data, like get and put // now can have sanity checks you couldn't enforce when the map was public } 

另外,看看Guava的Mulitmap / Multiset实用程序,它们对于这样的情况非常有用,特别是它们自动执行内部对象初始化。 对于你的情况,几乎任何时候你实现Map你真的想要一个Guava Multiset。 更清洁,更清晰。

必须先创建一个对象,然后才能通过引用变量使用它。 这个对象有多复杂并不重要。 您不需要在构造函数中初始化它,尽管这是最常见的情况。 根据您的需要,您可能希望使用“延迟初始化”。

  1. 不要使用HashMap声明变量。 这太限制了。
  2. 是的,您需要初始化class_feature_counts 。 您将为其添加条目,因此它必须是有效的地图。 实际上,在声明而不是在构造函数中初始化它们,因为每个启动只有一种方法。 我希望你现在正在使用Java 7; 这种方式更简单。

    private Map classCounts = new HashMap <>();

    private Map > classFeatureCounts = new HashMap <>();

编译器将从<>中推断出类型。 此外,我将变量名称更改为标准Java驼峰式样式。 classCountsclassFeatureCounts是否classFeatureCounts连接?