我是新来的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
}
}
注意:这个问题是不是针对朴素贝叶斯分类器,只是想我要提供一些背景。
是的,你需要对它进行初始化。
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);
递归通用数据结构,如地图的地图,而不是彻头彻尾的坏主意,常反映的东西,你可以重构 - 内地图往往会是一阶对象(持有地图),而不是简单的地图。 你仍然必须初始化这些内在的对象,但它往往是建立一个更清洁,更清晰的方式。
举例来说,如果你有一个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>
你真的想要一个番石榴多集。 清洁,更清晰。
通过参考变量使用它之前,你必须创建一个对象。 这不要紧,对象的复杂程度。 你是不是需要在构造函数初始化它,尽管这是最常见的情况。 根据您的需求,您可能需要使用“延迟初始化”来代替。
- 不要用声明变量
HashMap
。 它太受限制。 是的,你需要初始化class_feature_counts
。 你会添加条目,所以它必须是一个有效的地图。 事实上,初始化无论是在声明而不是在构造函数中,因为只有一个每个启动方式。 我希望你用Java 7的现在; 这是简单的这种方式。
私人地图<字符串,整数> classCounts =新的HashMap <>();
私人地图<字符串,地图<字符串,整数>> classFeatureCounts =新的HashMap <>();
编译器将来自<>推导出的类型。 另外,我改变了变量名的标准Java驼峰风格。 被classCounts
和classFeatureCounts
连接?