【问题标题】:How we can declare nested collection as a type (Like HashMap in HashMap)? [duplicate]我们如何将嵌套集合声明为一种类型(如 HashMap 中的 HashMap)? [复制]
【发布时间】:2020-11-07 22:12:42
【问题描述】:

我想声明一个HashMap 和另一个HashMap 作为它的值类型。我有这段代码,但它不起作用:

private HashMap<String, String> ContactData= new HashMap<String, String>();
private HashMap<String, String> Messages= new HashMap<String, String>();
private HahsMap<String, Messages> MessegesStructure= new HashMap<String, Messages>();

这是我在控制台中遇到的错误:

Error:(10, 29) java: cannot find symbol
  symbol:   class Messages
  location: class com.company.ContactClass
Error:(10, 78) java: cannot find symbol
  symbol:   class Messages
  location: class com.company.ContactClass
Error:(10, 13) java: cannot find symbol
  symbol:   class HahsMap
  location: class com.company.ContactClass

此代码无法编译。我怎样才能让它发挥作用?

【问题讨论】:

  • 提问时请使用清晰的英语;然后,至少在您的 IDE 中尝试您的代码,然后再将其发布到这里;最后 - 是的,您可以将任何集合嵌入到任何其他集合中。
  • 嗨,谢谢,很明显我在 IDE 中尝试了我的代码,但我给出了错误,我问这个问题的原因是。英语不是我的第一语言,显然我不能说流利的英语,但我试图提高我的口语技巧。请你给我举一个HashMap中的HashMap的例子好吗?
  • 在这种情况下,您应该上传您的代码以及您所拥有的错误消息。这样你就可以告诉听众你到目前为止做了什么,问题是什么,你的目标是什么。请参阅我刚刚为您写的答案。
  • 我已经更新了你的问题,它不是很清楚,无法理解且语法正确。如果对您有帮助,您可以投票支持我的回答。
  • 是的,我明白了,谢谢

标签: java generics collections hashmap


【解决方案1】:

您在代码中所做的 - 语义语法 都不正确。我建议您学习 Java 的基础知识,因为您似乎不知道什么是类型和声明。

您必须在声明变量时使用 SomeType。使用引用(或任何其他)变量作为类型,没有任何意义并且不会被编译。你的引用变量是一个variable,它引用了对象,用另一个变量声明(或定义)你的变量不是一个有效的逻辑。


回答关于将 Type 嵌入泛型类型的问题:是的,您可以将任何类型作为 keyvalue 声明。

2级深度HashMap,其值类型为另一个HashMap,如下所示:

HashMap<String, HashMap<String, HashMap>> twoLevelDepthEmbeddedHashMap 
= new HashMap<String, HashMap<String, HashMap>>();

3级深度HashMap,其值类型为另一个HashMap,其值类型又为HashMap,如下所示:

HashMap<String, HashMap<String, HashMap<String, String>>> threeLevelDepthEmbeddedHashMap
= new HashMap<String, HashMap<String, HashMap<String, String>>>();

注意 1:如果您是出于学习目的而尝试这样做,那么没关系;但是,在现实生活场景中尽量避免这种嵌入设计;

注意 2:请不要将变量名的首字母大写。根据Java Code/Naming ConventionsPascalCase 的变量不行。

【讨论】:

    【解决方案2】:

    您收到错误是因为您使用对象作为类型。

    private HashMap<String, Messages> MessegesStructure= new HashMap<String, Messages>();
    

    这里MessagesHashMap&lt;String, String&gt; 的对象,这就是问题所在。使用类型HashMap&lt;String, String&gt; 而不是Messages

    private HashMap<String, HashMap<String, String>> MessegesStructure= new HashMap<String, HashMap<String, String>>();
    

    注意:请尽量以小写字母开头。

    【讨论】:

    • 非常感谢,您说的是真的。 :-)
    【解决方案3】:

    你可以使用扩展来引入类型

        class Messages extends HashMap<String, String> {};
        HashMap<String, Messages> messageStructure = new HashMap<>();
    

    这样

        /*
         * Usage
         */
        Messages messages = new Messages();
        messages.put("someKey", "someValue");
        messages.put("someOtherKey", "someOtherValue");
        
        messageStructure.put("someMessagesKey", messages);
        
        messageStructure.forEach((key,value) -> System.out.println(key + "\t" + value));
    

    打印

    someMessagesKey {someOtherKey=someOtherValue, someKey=someValue}
    

    另一方面,我更喜欢作曲,即

        class Messages {
            private HashMap<String, String> messages = new HashMap<>();
            
            public void put(String key, String value) {
                messages.put(key, value);
            }
    
            @Override
            public String toString() {
                return "Messages [messages=" + messages + "]";
            }
        }
        
        HashMap<String, Messages> messageStructure = new HashMap<>();
    

    因为这将允许您稍后更改“消息”实现的底层数据结构。

    【讨论】:

    • 没错,这是我的应用程序的功能之一,每个用户都可以根据内容扩展消息注释。你的想法很棒。感谢您的全面指导。
    猜你喜欢
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多