我遇到了许多人似乎从PHP中遇到的同样问题,缺乏一个体面且易于使用的关联数组解决方案。 我在这里阅读了一些基本上都建议使用HashMap的问题,比如Q:Java associative-array
但是,我不认为所提到的解决方案能解决我的问题。我会解释一下。
我有一个包含250个项目(国家/地区)的列表,我想要存储数据。数据长度未定义,这意味着它可以为每个“列”保留多个条目,有时没有条目,有时是4,等等。
在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 这样做的原因我需要能够轻松监督所有事情,并在需要时更改几行值。这很灵活,我可以很容易地根据国家/地区代码,语言获取国家/地区名称,或者我可以在需要时获取country_data HashMap,或者所有国家/地区名称等等。
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
答案 0 :(得分:12)
也许我误解了你的问题,但为什么不创建自己的对象来保存数据,然后将它们存储在HashMap中?
Java是一种面向对象的语言,所以为什么不使用它最着名的工具:对象!
答案 1 :(得分:11)
PHP中的数组实际上是哈希,而不是数组。
在java中使用的正确的东西是HashMap。您还可以通过在其中存储数组或列表来将多重值存储在Hashmap中。因此HashMap<String, HashMap<String, Object>
或Hashmap<String, List<Object>>
可能会对您有所帮助。
使用多维数组时,必须使用整数作为键。
答案 2 :(得分:8)
您可以将数组存储为HashMap
:
HashMap<Integer,String[]> hm = new HashMap<Integer,String[]>();
hm.put( 1, new String[]{ "a", "b" } );
对于拥有“多维”键,您始终可以将它们与类一起包装。另一个虽然很丑陋的解决方案是HashMap
s HashMap
s。
答案 3 :(得分:5)
正确的方法是使用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"));
}
你可以通过嵌套列表和地图来实现这个目的,如果你不打算使用编译器给你的工具,为什么要使用Java呢?
答案 4 :(得分:2)
Map<String, Object> map = new HashMap<String, Object>();
现在代替Array放置List,在正常情况下,您只需将String作为值。
另一种方法是使用值对象来存储你给它的任何东西。
public class ValueObject {
private Map<String, List<Object>> dataHolder = null; //getter, setter
}
Map<String, ValueObject> map = new HashMap<String, ValueObject>();
答案 5 :(得分:1)
或者,如果您可以静态定义有关国家/地区,货币和语言的信息,则可以将所有内容放在一组枚举中:
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);
}
}
然后你可以很容易地做一些事情:
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);