Java - Initialize a HashMap of HashMaps

前端 未结 4 1681
小蘑菇
小蘑菇 2020-12-17 15:52

I am new to java and practicing by creating a simplistic NaiveBayes classifier. I am still new to object instantiation, and wonder what to do to initialize a HashMap of Has

相关标签:
4条回答
  • 2020-12-17 16:07

    Recursive generic data structures, like maps of maps, while not an outright bad idea, are often indicative of something you could refactor - the inner map often could be a first order object (with named fields or an internal map), rather than simply a map. You'll still have to initialize these inner objects, but it often is a much cleaner, clearer way to develop.

    For instance, if you have a Map<A,Map<B,C>> you're often really storing a map of A to Thing, but the way Thing is being stored is coincidentally a map. You'll often find it cleaner and easier to hide the fact that Thing is a map, and instead store a mapping of Map<A,Thing> where thing is defined as:

    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
    }
    

    Also, look into Guava's Mulitmap/Multiset utilities, they're very useful for cases like this, in particular they do the inner-object initializations automatically. Of note for your case, just about any time you implement Map<E, Integer> you really want a Guava Multiset. Cleaner and clearer.

    0 讨论(0)
  • 2020-12-17 16:16

    Yes, you need to initialize it.

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

    When you want to add a value to class_feature_counts, you need to instantiate it too:

    HashMap<String, Integer> val = new HashMap<String, Integer>();
    // Do what you want to do with val
    class_feature_counts.put("myKey", val);
    
    0 讨论(0)
  • 2020-12-17 16:17
    1. Do not declare your variables with HashMap. It's too limiting.
    2. Yes, you need to initialize class_feature_counts. You'll be adding entries to it, so it has to be a valid map. In fact, initialize both at declaration and not in the constructor since there is only one way for each to start. I hope you're using Java 7 by now; it's simpler this way.

      private Map< String, Integer> classCounts = new HashMap<>();

      private Map< String, Map< String, Integer>> classFeatureCounts = new HashMap<>();

    The compiler will deduce the types from the <>. Also, I changed the variable names to standard Java camel-case style. Are classCounts and classFeatureCounts connected?

    0 讨论(0)
  • 2020-12-17 16:23

    You must create an object before using it via a reference variable. It doesn't matter how complex that object is. You aren't required to initialize it in the constructor, although that is the most common case. Depending on your needs, you might want to use "lazy initialization" instead.

    0 讨论(0)
提交回复
热议问题