关联数组与Java

关联数组与Java,java,arrays,multidimensional-array,Java,Arrays,Multidimensional Array,我遇到了很多人似乎都面临的来自PHP的相同问题,即缺乏一个像样且易于使用的关联数组解决方案。 我在这里读过一些问题,它们基本上都建议使用HashMap,比如: 然而,我认为上面提到的解决方案不能解决我的问题。我会解释的 我有一个包含250个项目(国家)的列表,我想为这些项目存储数据。数据长度未定义,这意味着每个“列”可以包含多个条目,有时不包含条目,有时为4条,等等 public class iso_countries { Map<String, Object> coun

我遇到了很多人似乎都面临的来自PHP的相同问题,即缺乏一个像样且易于使用的关联数组解决方案。 我在这里读过一些问题,它们基本上都建议使用HashMap,比如:

然而,我认为上面提到的解决方案不能解决我的问题。我会解释的

我有一个包含250个项目(国家)的列表,我想为这些项目存储数据。数据长度未定义,这意味着每个“列”可以包含多个条目,有时不包含条目,有时为4条,等等

public class iso_countries {  
    Map<String, Object> country_data        = new HashMap<String, Object>();
    Map<String, String> country_name        = new HashMap<String, String>();
    Map<String, String[]> country_idd       = new HashMap<String, String[]>();
    Map<String, String[]> country_cid       = new HashMap<String, String[]>();

    public iso_countries(){      
         country_name.put("nl",         "Netherlands");      
         country_idd.put("nl",      new String[]{"+31"});
         country_cid.put("nl",      new String[]{"#31#", "*31#"});
         setData(country_name, country_cid, country_idd);
         // 249 * 4 lines more and later...
    }//end method

    public void setData(Map country_name, Map country_cid, Map country_idd){
         country_data.put("name",   country_name);
         country_data.put("idd",    country_idd);
         country_data.put("cid",    country_cid);
    }//end method   

    public String getCountryName(String countryCode){
        String name     = country_name.get(countryCode);
        return name;
    }//end method

    public String[] getCountryIdd(String countryCode){
        String prefix[] = country_idd.get(countryCode);
        return prefix;
    }//end method

    public String[] getCountryCid(String countryCode){
        String cid[]    = country_cid.get(countryCode);
        return cid;
    }//end method
}//end class
在PHP中,我可以这样做:

$country_data = new array();
$country_data["nl"]["currency"] = "euro";
$country_data["nl"]["languages"] = "Dutch";
...
$country_data["us"]["currency"] = "US dollar";
$country_data["us"]["languages"] = array("English", "Spanish");
所以有时候我想存储一个数组,有时候不想。当然,它也可以是一个只有一个条目而不是字符串的数组,但我只是说

所以,问题是,如何在HashMap的数组中存储和获取数组?我知道我几乎被难看的HashMap解决方案困住了,但我仍然看不出这将如何让我存储数组,我确信我忽略了一些简单的东西。一个基于我的例子将是伟大的

更新

我选择了HashMaps的HashMaps 之所以如此,我需要能够轻松地监督一切,并在需要时更改几行值。这很灵活,我可以很容易地根据国家代码、语言获取国家名称,或者在需要时获取国家数据哈希图,或者所有国家名称,等等

public class iso_countries {  
    Map<String, Object> country_data        = new HashMap<String, Object>();
    Map<String, String> country_name        = new HashMap<String, String>();
    Map<String, String[]> country_idd       = new HashMap<String, String[]>();
    Map<String, String[]> country_cid       = new HashMap<String, String[]>();

    public iso_countries(){      
         country_name.put("nl",         "Netherlands");      
         country_idd.put("nl",      new String[]{"+31"});
         country_cid.put("nl",      new String[]{"#31#", "*31#"});
         setData(country_name, country_cid, country_idd);
         // 249 * 4 lines more and later...
    }//end method

    public void setData(Map country_name, Map country_cid, Map country_idd){
         country_data.put("name",   country_name);
         country_data.put("idd",    country_idd);
         country_data.put("cid",    country_cid);
    }//end method   

    public String getCountryName(String countryCode){
        String name     = country_name.get(countryCode);
        return name;
    }//end method

    public String[] getCountryIdd(String countryCode){
        String prefix[] = country_idd.get(countryCode);
        return prefix;
    }//end method

    public String[] getCountryCid(String countryCode){
        String cid[]    = country_cid.get(countryCode);
        return cid;
    }//end method
}//end class
公共类iso_国家{
Map country_data=new HashMap();
Map country_name=new HashMap();
Map country_idd=new HashMap();
Map country_cid=new HashMap();
公共iso_国家({
国家名称(荷兰);
国家ID.put(“nl”,新字符串[]{“+31”});
country#cid.put(“nl”,新字符串[]{“#31#”,“*31#”});
setData(国家/地区名称、国家/地区cid、国家/地区ID);
//249*4行更多更高版本。。。
}//结束方法
公共无效设置数据(地图国家/地区名称、地图国家/地区cid、地图国家/地区idd){
国家/地区数据。输入(“名称”,国家/地区名称);
国家/地区数据。输入(“idd”,国家/地区idd);
国家/地区数据输入(“cid”,国家/地区cid);
}//结束方法
公共字符串getCountryName(字符串countryCode){
字符串名称=country\u name.get(countryCode);
返回名称;
}//结束方法
公共字符串[]getCountryIdd(字符串countryCode){
字符串前缀[]=country_idd.get(countryCode);
返回前缀;
}//结束方法
公共字符串[]getCountryCid(字符串countryCode){
字符串cid[]=country_cid.get(countryCode);
返回cid;
}//结束方法
}//末级

也许我误解了您的问题,但是为什么不创建自己的对象来保存数据,然后将它们存储在HashMap中呢


Java是一种面向对象的语言,所以为什么不使用它最著名的工具:对象

PHP中的数组实际上是散列,而不是数组

在java中正确使用的东西是HashMap。您还可以通过在Hashmap中存储数组或列表,将多文件值存储在Hashmap中。所以
HashMap
Map Map=newhashmap();
现在,不再放置数组,而是在正常情况下将字符串作为值放置

另一种方法是使用value对象,它存储您所给予的任何东西

public class ValueObject {

   private Map<String, List<Object>> dataHolder = null; //getter, setter
}

Map<String, ValueObject> map = new HashMap<String, ValueObject>();
公共类ValueObject{
私有映射数据持有者=null;//getter,setter
}
Map Map=newhashmap();

您可以将数组存储为
哈希映射的值:

HashMap<Integer,String[]> hm = new HashMap<Integer,String[]>();
hm.put( 1, new String[]{ "a", "b" } );
HashMap hm=newhashmap();
hm.put(1,新字符串[]{“a”,“b”});

至于具有“多维”键,您总是可以将它们与类包装在一起。另一个解决方案(尽管很难看)是使用
HashMap
s的
HashMap
s。正确的方法是使用Country对象:

class Country {
    // Might want these private with getters and/or setters
    public String currency;
    public Set<String> languages;

    // String...languages is like String[] languages, except you can pass the
    // arguments in like new Country("Euro", "Dutch", "German")
    // instead of new Country("Euro", new String[] { "Dutch", "German" })
    // It's purely stylistic
    public Country(String currency, String... languages) {
        this.currency = currency;
        this.languages = new HashSet<String>();
        for(String language : languages) {
            this.languages.add(language);
        }
        // or this.languages = new HashSet<String>(Arrays.asList(languages));
    }
}

void someFunction() {
    Map<String, Country> countries = new HashMap<String, Country>():
    countries.put("us", new Country("US Dollar", "English", "Spanish"));
    countries.put("nl", new Country("Euro", "Dutch"));
}
国家级{
//可能需要使用getter和/或setter进行私有化
公共字符串货币;
公共集合语言;
//String…languages与String[]语言类似,只是您可以传递
//类似新国家的争论(“欧元”、“荷兰”、“德国”)
//代替新的国家(“欧元”,新的字符串[]{“荷兰”,“德国”})
//这纯粹是风格上的
公共国家(字符串货币、字符串…语言){
这个。货币=货币;
this.languages=new HashSet();
for(字符串语言:语言){
this.languages.add(语言);
}
//或者this.languages=newhashset(Arrays.asList(languages));
}
}
void函数(){
Map countries=new HashMap():
国家。put(“美国”、新国家(“美元”、“英语”、“西班牙语”);
国家。put(“nl”、新国家(“欧元”、“荷兰”);
}

您可以通过嵌套列表和映射来实现这一点,如果您不打算使用编译器提供的工具,为什么要使用Java?

或者,如果您关于国家、货币和语言的信息可以静态定义,您可以将所有这些信息放在一组枚举中:

public enum Language {
    EN, ES, FR; 
}

public enum Currency    {
    USD, GBP, CAD;
}

public enum Country {

    US(USD, EN), UK(GBP, EN), CAN(CAD, EN, FR);

    private final Language[] languages;
    private final Currency currency;

    Country(Currency currency, Language... languages) {
        this.currency = currency;
        this.languages = Arrays.copyOf(languages, languages.length);
    }

    public Currency getCurrency() {
        return this.currency;
    }

    public Collection<Language> getLanguages() {
        return asList(this.languages);
    }
}
公共枚举语言{
EN,ES,FR;
}
公共枚举货币{
美元、英镑、加拿大元;
}
公共枚举国家{
美国(美元,欧洲)、英国(英镑,欧洲)、加拿大(加拿大、欧洲、法国);
专用最终语言[]种语言;
私人最终货币;
国家(货币、语言……语言){
这个。货币=货币;
this.languages=Arrays.copyOf(languages,languages.length);
}
公共货币getCurrency(){
返回该货币;
}
公共集合getLanguages(){
返回asList(this.languages);
}
}
然后,您可以很容易地执行以下操作:

Map<Integer, Country> data = new HashMap<Integer, Country>();
data.put(0, US);
data.put(1, UK);

Currency currency = data.get(0).getCurrency();
Collection<Language> langs = data.get(0).getLanguages();

System.out.println(currency);
System.out.println(langs);
Map data=newhashmap();
数据。put(0,美国);
数据。put(1,英国);
Currency Currency=data.get(0.getCurrency();
Collection langs=data.get(0.getLanguages();
系统输出打印项次(货币);
系统输出打印LN(langs);

您想在php中实现类似hashmap的行为,还是要在java中实现代码?为什么列表中有国家代码