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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18326386/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 00:31:42  来源:igfitidea点击:

Java HashMap associative multi dimensional array can not create or add elements

javaarraysmultidimensional-arrayhashmap

提问by jsherk

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");

采纳答案by Daniel Gabriel

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 HashMapobject stored in our outer HashMapunder the key "en". If not, we create an empty one.

在 Java 中,您必须明确说明何时创建对象。在这种情况下,首先我们检查是否已经有一个HashMap对象存储在我们的外部HashMap键“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,然后放入新值。

回答by Ted Hopp

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");

回答by Jerome

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);

回答by dAv dEv

import java.util.HashMap;
public class Main
{
    public static void main(String[] args) {
        // Creating array
        HashMap<String, HashMap<String, String>> myArray = new HashMap<String, HashMap<String, String>>();
        // Setting values
        for(int i=0; i<100;i++) {
            myArray.put("key1"+i, new HashMap<String, String>());
            myArray.get("key1"+i).put("key2"+i, "value"+i);
        }
        // Getting values
        for(int i=0; i<100; i++) {
        System.out.println(myArray.get("key1"+i).get("key2"+i));
        }
    }
}