Ассоциативные массивы и Java
Я столкнулся с той же проблемой, с которой многие люди, похоже, сталкиваются, исходя из PHP, отсутствие достойного и простого в использовании ассоциативного решения массива. Я читал здесь вопросы, которые в основном все предлагали использовать хэш-карту, как этот 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, но я все еще не вижу, как это позволит мне хранить я уверен, что упускаю из виду что-то простое. Пример, основанный на моем, был бы великолепен!
Обновить
Я решил пойти на хэш-карты хэш-карт Причина этого в том, что я должен быть в состоянии легко контролировать все, и изменить несколько строк ценностей, когда это необходимо. И это гибко, я могу легко получить название страны на основе кода страны, языка, или я могу получить хэш-карту country_data, когда мне это нужно, или все названия стран и т. д.
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
6 ответов:
Массивы можно хранить в виде значений a
HashMap
:HashMap<Integer,String[]> hm = new HashMap<Integer,String[]>(); hm.put( 1, new String[]{ "a", "b" } );
Что касается наличия" многомерных " ключей, вы всегда можете обернуть их вместе с классом. Еще один, пусть и уродливую, будет решение у
HashMap
хHashMap
' ы.
Возможно, я неправильно понял вашу проблему, но почему бы не создать свой собственный объект для хранения данных, а затем сохранить их в хэш-карте?
Java-объектно-ориентированный язык, так почему бы не использовать его самый известный объект: objects!
Массив в PHP на самом деле является хэшем, а не массивом.
Правильная вещь для использования в java-это хэш-карта. Вы также можете хранить значения нескольких файлов в хэш-карте, сохраняя в ней массивы или списки. Так что
HashMap<String, HashMap<String, Object>
илиHashmap<String, List<Object>>
могут вам помочь.Когда вы используете многомерные массивы, вы должны использовать целые числа в качестве ключа.
Правильный способ-использовать объект 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, если вы не собираетесь использовать инструменты, которые предоставляет компилятор?
Map<String, Object> map = new HashMap<String, Object>();
Теперь вместо массива вы размещаете список, в обычных случаях вы просто разместите строку в качестве значения.
Другой подход будет заключаться в использовании объекта ценности, который хранит все, что вы ему дали.public class ValueObject { private Map<String, List<Object>> dataHolder = null; //getter, setter } Map<String, ValueObject> map = new HashMap<String, ValueObject>();
В качестве альтернативы, если ваша информация о странах, валютах и языках может быть статически определена, вы можете поместить все это в набор перечислений:
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);