爪哇 - 初始化HashMaps这样的一个HashMap(Java - Initialize a H

2019-07-23 09:26发布

我是新来的Java,并通过创建一个简单的NaiveBayes分类练习。 我还是新的对象实例化,并想知道做初始化HashMaps这样的一个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
     }
}

注意:这个问题是不是针对朴素贝叶斯分类器,只是想我要提供一些背景。

Answer 1:

是的,你需要对它进行初始化。

class_feature_counts = new HashMap<String, HashMap<String, Integer>>();

当你想添加一个值class_feature_counts,您需要实例太:

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


Answer 2:

递归通用数据结构,如地图的地图,而不是彻头彻尾的坏主意,常反映的东西,你可以重构 - 内地图往往会是一阶对象(持有地图),而不是简单的地图。 你仍然必须初始化这些内在的对象,但它往往是建立一个更清洁,更清晰的方式。

举例来说,如果你有一个Map<A,Map<B,C>>你真的经常存储地图A到事情,但事情的方式被存储是不约而同的地图。 你会经常发现它更干净,更容易掩盖一个事实,那件事是地图,而是存储的映射Map<A,Thing>这里的东西定义为:

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
}

此外,考虑番石榴的Mulitmap /多集公用事业,他们对于这样的情况下非常有用,尤其是它们自动做内部对象初始化。 注:对于你的情况下,几乎任何时候你实现Map<E, Integer>你真的想要一个番石榴多集。 清洁,更清晰。



Answer 3:

通过参考变量使用它之前,你必须创建一个对象。 这不要紧,对象的复杂程度。 你是不是需要在构造函数初始化它,尽管这是最常见的情况。 根据您的需求,您可能需要使用“延迟初始化”来代替。



Answer 4:

  1. 不要用声明变量HashMap 。 它太受限制。
  2. 是的,你需要初始化class_feature_counts 。 你会添加条目,所以它必须是一个有效的地图。 事实上,初始化无论是在声明而不是在构造函数中,因为只有一个每个启动方式。 我希望你用Java 7的现在; 这是简单的这种方式。

    私人地图<字符串,整数> classCounts =新的HashMap <>();

    私人地图<字符串,地图<字符串,整数>> classFeatureCounts =新的HashMap <>();

编译器将来自<>推导出的类型。 另外,我改变了变量名的标准Java驼峰风格。 被classCountsclassFeatureCounts连接?



文章来源: Java - Initialize a HashMap of HashMaps