Java-初始化HashMap的HashMap

Java-初始化HashMap的HashMap,java,oop,initialization,Java,Oop,Initialization,我是java新手,通过创建一个简单的朴素贝叶斯分类器来练习。我还不熟悉对象实例化,不知道如何初始化HashMap的HashMap。在将新的观察结果插入分类器时,我可以为给定类中看不见的特性名称创建一个新的HashMap,但是我需要初始化吗 import java.util.HashMap; public class NaiveBayes { private HashMap<String, Integer> class_counts; private HashMap

我是java新手,通过创建一个简单的朴素贝叶斯分类器来练习。我还不熟悉对象实例化,不知道如何初始化HashMap的HashMap。在将新的观察结果插入分类器时,我可以为给定类中看不见的特性名称创建一个新的HashMap,但是我需要初始化吗

import java.util.HashMap;

public class NaiveBayes {

    private HashMap<String, Integer> class_counts;
    private HashMap<String, HashMap<String, Integer>> class_feature_counts;

    public NaiveBayes() {
        class_counts = new HashMap<String, Integer>();
        // 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
     }
}
import java.util.HashMap;
公共类贝叶斯{
私有HashMap类_计数;
私有HashMap类\特征\计数;
公共贝叶斯(){
class_counts=new HashMap();
//我需要初始化类\u功能\u计数吗?
}
公开作废插入(){
//待办事项
//我想我可以在这里动态创建新的hashmaps,用于类\功能\计数
}
公共字符串分类(){
//存根
返回“”;
}
//幼稚评分:
//p(c | f|u 1,…f|n)=~p(c)*p(f|u 1 | c).*p(f|n | c)
私有双get_分数(字符串类别、HashMap功能){
//存根
返回0.0;
}
公共静态void main(字符串[]args){
NaiveBayes bayes=新NaiveBayes();
//待办事项
}
}

请注意,这个问题并不特定于NaiveBayes分类器,我只是想提供一些上下文。

在通过引用变量使用对象之前,必须先创建一个对象。不管那个物体有多复杂。您不需要在构造函数中初始化它,尽管这是最常见的情况。根据您的需要,您可能希望改用“惰性初始化”。

是的,您需要初始化它

class_feature_counts = new HashMap<String, HashMap<String, Integer>>();
class_feature_counts=new HashMap();
当您想要向类\功能\计数添加值时,您也需要实例化它:

HashMap<String, Integer> val = new HashMap<String, Integer>();
// Do what you want to do with val
class_feature_counts.put("myKey", val);
HashMap val=newhashmap();
//做你想对val做的事
类特征计数。输入(“myKey”,val);

递归通用数据结构,如映射的映射,虽然不是一个彻底的坏主意,但通常是-内部映射通常可以是一阶对象(带有命名字段或内部映射),而不仅仅是一个映射。您仍然需要初始化这些内部对象,但这通常是一种更干净、更清晰的开发方式

例如,如果您有一个
映射实用程序,它们对于这种情况非常有用,特别是它们会自动进行内部对象初始化。值得注意的是,几乎在您实现
Map
的任何时候,您都真正想要一个番石榴多集。越来越干净

  • 不要使用
    HashMap
    声明变量。这太有限了

  • 是的,您需要初始化
    类\u功能\u计数
    。您将向它添加条目,因此它必须是有效的映射。事实上,在声明时初始化,而不是在构造函数中初始化,因为每种方法只有一种启动方式。我希望您现在正在使用Java7;这样比较简单

    私有映射classCounts=newhashmap()

    私有映射<字符串,映射<字符串,整数>>classFeatureCounts=new HashMap()


  • 编译器将从中推断出类型。此外,我还将变量名更改为标准Java camel大小写样式。
    classCounts
    classFeatureCounts
    是否连接?

    “…我需要初始化吗?”是的。哈希映射的哈希映射通常是缺少对象和封装的标志。很酷,我很欣赏。你有什么建议吗?我一直认为这是一个两级哈希,因此,例如,如果这是垃圾邮件检测,我可以有
    {spam:{“bank account”:3,“伟哥”:9}
    您的想法是什么?从某种意义上说,是的,它们是相互关联的,它们各自包含有关某些字符串出现次数的信息,例如,请参阅的第6章。感谢您对驼峰壳的介绍。感谢您提供的提示,我将看一看Guava的多重集。关于递归泛型结构,您有什么建议吗知道我想要一个固定的2级散列,就像上面的垃圾邮件检测评论一样。你会建议创建一个类似featureCount的类,然后创建这些类的散列图吗?是的,这是一般的想法,更新了我的答案。番石榴帮助解决了大量常见的Java问题,一定要看看。只是谷歌搜索一下“java HashMap of HashMap”希望能为一个不那么笨拙的设计提供一个建议。现在我看到了这一点,这有点“废话”“片刻,但这很完美。谢谢!嗨@BobTheBuilder,我有一个问题,关于在这一点之后要做什么。假设在上面的示例中,我要检索存储在class\u feature\u counts键“MyKey”下的HashMap。我会执行
    class\u feature\u count.get(“MyKey”)
    。但是,这会返回一个“Object”对象,而不是“HashMap”对象。如何将该对象强制转换为HashMap?谢谢。您应该使用:
    HashMap nestedAdBook=new HashMap();
    @BobTheBuilder使用Java 8/9在2017年是否仍然如此?映射中的内部类型是否需要实例化?例如
    Map
    。立即添加到列表中是否安全?您仍然需要实例化它。
    public class Thing {
        // Map is guaranteed to be initialized if a Thing exists
        private Map<B,C> data = new Map<B,C>();
    
        // operations on data, like get and put
        // now can have sanity checks you couldn't enforce when the map was public
    }