10

多くの人が PHP から来て直面しているように見えるのと同じ問題に遭遇しました。適切で使いやすい連想配列ソリューションの欠如です。ここで質問を読みましたが、基本的にはすべて、この Q: Java associative-array のように HashMap を使用することを提案しています。

ただし、言及されている解決策が私の問題を解決するとは思いません。説明します。

データを保存したい 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");

そのため、配列を保存したい場合とそうでない場合があります。もちろん、文字列ではなく、エントリが 1 つだけの配列でもかまいませんが、私は言っているだけです。

問題は、配列を 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
4

6 に答える 6

12

私はあなたの問題を誤解しているかもしれませんが、データを保持する独自のオブジェクトを作成してから、それらを HashMap に保存してみませんか?

Java はオブジェクト指向言語です。Java の最も有名な機能であるオブジェクトを使用しない手はありません。

于 2012-06-01T19:45:32.683 に答える
11

PHP の配列は、実際には配列ではなくハッシュです。

Java で使用する正しいものは HashMap です。配列またはリストを格納することで、Hashmap に複数の値を格納することもできます。そうHashMap<String, HashMap<String, Object>Hashmap<String, List<Object>>、あなたを助けるかもしれません。

多次元配列を使用する場合、整数をキーとして使用する必要があります。

于 2012-06-01T19:45:33.020 に答える
8

配列を a の値として格納できますHashMap

HashMap<Integer,String[]> hm = new HashMap<Integer,String[]>();
hm.put( 1, new String[]{ "a", "b" } );

「多次元」キーを持つ場合は、いつでもクラスでラップできます。醜いとはいえ、もう 1 つの解決策は、HashMaps のHashMaps を持つことです。

于 2012-06-01T19:46:56.060 に答える
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を使用するのでしょうか?

于 2012-06-01T19:50:02.803 に答える
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>();
于 2012-06-01T19:46:34.783 に答える
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);
于 2012-06-01T20:12:55.250 に答える