2017-12-06 6 views
0

次の質問プロンプトです: 形式で以下の情報をハッシュを作成します -どのようにオブジェクトの配列を文字列arrrayに変換し、個々の要素を分割しますか?

COUNTRYNAME =>"capital:population:currency name"を少なくとも5つのレコードを作成します。

最大の人口を持つ国の詳細を印刷 大文字の名前が "L"で始まる国の通貨名を印刷します。

これは、put()というレコードを設定し、hashmapの値を配列に変換し、配列を":"の区切りで分割し、ループを実行してそれぞれの列から最大値を見つけ出すことを考えていました。

これが最善の方法であるのか、それとも良い方法があるのだろうと思っていました。その方法が理想的な場合は、Object [] countryValues(以下のコードで)を文字列配列に変換する際に問題があります。そのため、split関数を使用できます。

":"デリミタで値を分割すると予想されます。

HashMap<String,String> countrydata = new HashMap<String, String>(); 

    countrydata.put("USA", "Washington DC:323,000,000:Dollar"); 
    countrydata.put("Thailand", "Bangkok:69,000,000:Baht"); 
    countrydata.put("Vietnam", "Hanoi:93,000,000:Dong"); 
    countrydata.put("Laos", "Lientiane:7,000,000:Dollar"); 
    countrydata.put("Belize", "Belmopan:370,000:Dollar"); 

    Object [] countryValues = countrydata.keySet().toArray(); 

    for (int i=0; i<countryValues.length; i++){ 
     String [] splitted = countryValues[i].split(":"); 
    } 

    for (int j=0; j<splitted.length; j++){ 
     System.out.println(splitted[i]); 
    } 

エラー:

方法split(String)は、Object型のために定義されていません。

答えて

0

はみんなでコードを見てみましょう:

HashMap<String,String> countrydata = new HashMap<String, String>(); 

countrydata.put("USA", "Washington DC:323,000,000:Dollar"); 
countrydata.put("Thailand", "Bangkok:69,000,000:Baht"); 
countrydata.put("Vietnam", "Hanoi:93,000,000:Dong"); 
countrydata.put("Laos", "Lientiane:7,000,000:Dollar"); 
countrydata.put("Belize", "Belmopan:370,000:Dollar"); 

ですから、キーは国名ある地図を持っている、と値を分割する、文字列として様々な情報です。

Object [] countryValues = countrydata.keySet().toArray(); 

だから、オブジェクトの配列を作成している、配列内の各オブジェクトは、マップのキーです:国名。

for (int i=0; i<countryValues.length; i++){ 
    String [] splitted = countryValues[i].split(":"); 

このように、値の代わりにキーを分割しようとしています。さらに、forループを行うためにコレクションを配列に変換する必要は全くありません。犯人はこのラインである

for (String value: countrydata.values()) { 
    // split the value 
} 
+0

お寄せいただきありがとうございます。 さて、あなたが言及したようにforループを使用しようとしました。これは私が持っているものです: 'for(文字列値:countrydata.values()){
\t \t String [] arrayValue = value.split(": ");
\t \t}
\t \t \t \tがため(INT i = 0; I \t \t \tのSystem.out.println(arrayValue [I])。

+0

申し訳ありませんが、私は書式を理解しようとしていました。また、その反復で値を分割すると、要素(つまり、「ワシントンDC」、「323,000,000」、「ドル」など)を配列に割り当てることになりますか?しかし、それは私の配列(arrayValue)が解決された変数ではない値の1つを印刷しようとしていると言います。 最後に、個々の要素が本当に別の配列に格納されている場合、 –

+0

非常に多くの質問を申し訳ありませんが、私はこれをしばらく理解しようとしていましたが、苦労しています!! –

0

を:あなたが直接コレクションに反復処理できる

Object [] countryValues = countrydata.keySet().toArray(); 

間違ったことと命名されることに加えて(それは、countryValuescountryKeyscountryNamesではありません)それはの配列を作りますString配列ではなくObjectタイプです。

あなたは全くcountryValuesを必要としない。その代わり、このようなあなたのハッシュマップのentrySetをナビゲート:

for (Map.Entry<String,String> e : countrydata.entrySet()) { 
    String name = e.getKey(); 
    String data = e.getValue(); 
    ... 
} 

あなたは少しさらにこれを取るしたい場合は、4つのプロパティ(とクラスCountryDataを作ります母国語、母国語、通貨)を作成し、このクラスのインスタンスを作成してマップに配置します。マップのタイプをMap<String,CountryData>に変更します。このように、追加の処理を行う必要がある場合は、繰り返し分割する必要はありません。

0

java 8ストリームを使用すると、次のような操作が非常に簡単で効率的になります。国の単純なPOJOを定義するだけです。

 List<Country> countries = new ArrayList<>(); 

    countries.add(new Country("USA", "Washington DC", 323000000L, "Dollar")); 
    countries.add(new Country("Thailand", "Bangkok", 69000000L, "Baht")); 
    countries.add(new Country("Vietnam", "Hanoi", 93000000L, "Dong")); 
    countries.add(new Country("Laos", "Lientiane", 7000000L, "Dollar")); 
    countries.add(new Country("Belize", "Belmopan", 370000L, "Dollar")); 

    Set<String> filteredCountries = countries.stream() 
      .filter(p -> p.getCapital().startsWith("L")).map(p -> p.getName()) 
      .collect(Collectors.toSet()); 

    Country maxPopulationCountry = countries.stream() 
      .max(Comparator.comparing(p -> p.getPopulation())).get(); 

    System.out.println("Max Population Country Details : " + maxPopulationCountry); 
    System.out.println("Countries with Capital starts with L : " + filteredCountries); 
関連する問題