Java HashMap关联多维数组不能创建或添加元素

时间:2022-02-18 21:40:55

Okay so I have spent several hours trying to wrap my head around this concept of a HashMap in Java but am just not able to figure it out. I have looked at many tutorials but none seem to address my exact requirement and I cannot get it to work.

好吧,我花了好几个小时试图用Java来概括HashMap的概念,但是我还是搞不清楚。我看了很多教程,但是没有一个能满足我的要求,我不能让它工作。

I am trying to create an associative multi dimensional array in Java (or something similar) so that I can both save to and retrieve from the array with keys that are Strings.

我正在尝试在Java中创建一个关联的多维数组(或类似的东西),这样我就可以用字符串的键来保存和检索数组。

This is how I would do it in PHP and explains it best what I am trying to do:

这就是我在PHP中所做的,并且最好地解释了我正在尝试做的:

//loop one - assign the names
myArray['en']['name'] = "english name";
myArray['fr']['name'] = "french name";
myArray['es']['name'] = "spanish name";

//loop two - assign the description
myArray['en']['desc'] = "english description";
myArray['fr']['desc'] = "french description";
myArray['es']['desc'] = "spanish description";

//loop three - assign the keywords
myArray['en']['keys'] = "english keywords";
myArray['fr']['keys'] = "french keywords";
myArray['es']['keys'] = "spanish keywords";

//later on in the code be able to retrive any value similar to this
english_name = myArray['en']['name'];
french_name = myArray['fr']['name'];
spanish_name = myArray['es']['name'];

This is what I tried in Java but it is not working:

这是我在Java中尝试过的,但是没有效果:

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

myArray.put("en" , put("name", "english name")); //gives me "cannot find symbol" at second put

myArray.put("en" , ("name", "english name")); //gives me "')' expected" after second comma

So I am sure its something simple that I am missing but please point it out because this is very frustrating!

所以我确信我遗漏了一些简单的东西,但请指出来,因为这是非常令人沮丧的!

Thanks

谢谢

EDIT:

编辑:

So here is some working code on how I implemented the answer I accepted:

下面是一些关于我如何实现答案的工作代码:

import java.util.*;

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

String[] langArray = {"en","fr","de","no","es"};

//Initialize each language key ahead of time
for(String lang : langArray) { // foreach lang in langArray
  if (!finalArray.containsKey(lang)) {
    finalArray.put(lang, new HashMap<String, String>());
  }
}

//loop one - assign names
for(String lang : langArray) {
  String theName = lang + " name"; //go get the name from somewhere
  finalArray.get(lang).put("name", theName);
}

//loop two - assign description
for(String lang : langArray) {
  String theDesc = lang + " description"; //go get the description from somewhere
  finalArray.get(lang).put("desc", theDesc);
}

//loop three - assign keywords
for(String lang : langArray) {
  String theKeys = lang + " keywords"; //go get the keywords from somewhere
  finalArray.get(lang).put("keys", theKeys);
}

//display output
for(String lang : langArray) {
  System.out.println("LANGUAGE: " + lang);
  System.out.println(finalArray.get(lang).get("name"));
  System.out.println(finalArray.get(lang).get("desc"));
  System.out.println(finalArray.get(lang).get("keys"));
}

//example to retrieve/get values
String english_name = finalArray.get("en").get("name");
String french_desc = finalArray.get("fr").get("desc");

3 个解决方案

#1


18  

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

if (!myArray.containsKey("en")) {
    myArray.put("en", new HashMap<String, String>());
}
myArray.get("en").put("name", "english name");

In Java you have to be explicit about when you are creating an object. In this case first we check if there is already a HashMap object stored in our outer HashMap under the key "en". If not, we create an empty one.

在Java中,您必须明确创建对象的时间。在本例中,我们首先检查在外HashMap中是否已经有一个HashMap对象存储在key“en”下。如果不是,则创建一个空的。

Now to put a new value into it we have to first get it from the outer HashMap, then put the new value.

现在,要将一个新值放入其中,我们必须首先从外部HashMap中获取它,然后再放入新值。

#2


2  

Unfortunately, there's no concise syntax for constructing populated maps in Java. You'll have to write it out long-hand. A separate helper method can make it a little simpler:

不幸的是,在Java中没有构建填充映射的简洁语法。你得把它写出来。一个单独的助手方法可以使它更简单:

HashMap<String, String> makeMap(String name, String desc, String keys) {
    HashMap<String, String> map = new HashMap<>();
    // Before Java 7, above must be: new HashMap<String, String>();
    map.put("name", name);
    map.put("desc", desc);
    map.put("keys", keys);
}

Then:

然后:

HashMap<String, HashMap<String, String>> myArray = new HashMap<>();
myArray.put("en",
    makeMap("english name", "english description", "english keywords"));
// etc.

You would retrieve it with:

你可以用:

english_name = myArray.get("en").get("name");

#3


1  

HashMap<String, HashMap<String, String>> myArray = new HashMap<String, HashMap<String, String>>();
HashMap<String, String> value = new HashMap<String, String>();
value.put("name", "English name");
value.put("desc", "English description");
value.put("keys", "English keywords");

myArray.put("en" , value);

value = new HashMap<String, String>();
value.put("name", "French name");
value.put("desc", "French description");
value.put("keys", "French keywords");

myArray.put("fr" , value);

#1


18  

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

if (!myArray.containsKey("en")) {
    myArray.put("en", new HashMap<String, String>());
}
myArray.get("en").put("name", "english name");

In Java you have to be explicit about when you are creating an object. In this case first we check if there is already a HashMap object stored in our outer HashMap under the key "en". If not, we create an empty one.

在Java中,您必须明确创建对象的时间。在本例中,我们首先检查在外HashMap中是否已经有一个HashMap对象存储在key“en”下。如果不是,则创建一个空的。

Now to put a new value into it we have to first get it from the outer HashMap, then put the new value.

现在,要将一个新值放入其中,我们必须首先从外部HashMap中获取它,然后再放入新值。

#2


2  

Unfortunately, there's no concise syntax for constructing populated maps in Java. You'll have to write it out long-hand. A separate helper method can make it a little simpler:

不幸的是,在Java中没有构建填充映射的简洁语法。你得把它写出来。一个单独的助手方法可以使它更简单:

HashMap<String, String> makeMap(String name, String desc, String keys) {
    HashMap<String, String> map = new HashMap<>();
    // Before Java 7, above must be: new HashMap<String, String>();
    map.put("name", name);
    map.put("desc", desc);
    map.put("keys", keys);
}

Then:

然后:

HashMap<String, HashMap<String, String>> myArray = new HashMap<>();
myArray.put("en",
    makeMap("english name", "english description", "english keywords"));
// etc.

You would retrieve it with:

你可以用:

english_name = myArray.get("en").get("name");

#3


1  

HashMap<String, HashMap<String, String>> myArray = new HashMap<String, HashMap<String, String>>();
HashMap<String, String> value = new HashMap<String, String>();
value.put("name", "English name");
value.put("desc", "English description");
value.put("keys", "English keywords");

myArray.put("en" , value);

value = new HashMap<String, String>();
value.put("name", "French name");
value.put("desc", "French description");
value.put("keys", "French keywords");

myArray.put("fr" , value);