如何将Object数组转换为String arrray并从中拆分单个元素?

时间:2017-12-06 17:14:58

标签: java arrays hashmap

以下是问题提示: 使用格式 -

创建包含以下信息的哈希

countryname => "capital:population:currency name"创建至少5条记录。

打印人口最多的国家/地区的详细信息 打印资本名称以“L”开头的国家/地区的货币名称。

为此,我考虑使用put()填充记录,将hashmap的值转换为数组,使用":"分隔符拆分数组,并执行循环以找出最大值各栏目。

我想知道这是否是最佳方式,或者会有更好的方法。如果这种方式是理想的,我无法将Object [] countryValues(在下面的代码中)转换为String数组,因此我可以在其上使用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]);
     }

错误:

类型为Object的方法split(String)未定义。

3 个答案:

答案 0 :(得分: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");

所以你有一个Map,其中键是国家名称,值是各种信息作为字符串,要拆分。

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
}

答案 1 :(得分:0)

罪魁祸首就是这条线:

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

除了被命名为错误的内容(countryKeyscountryNames,而不是countryValues)之外,它还会生成一个Object类型的数组,而不是String } array。

您根本不需要countryValues:而是导航您的哈希映射的entrySet,如下所示:

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

如果您想更进一步,请创建一个包含四个属性(名称,大写,总体和货币)的类CountryData,创建此类的实例,并将它们放在地图中。将地图的类型更改为Map<String,CountryData>。这样,如果您需要进行一些额外的处理,则不需要重复拆分。

答案 2 :(得分:0)

使用java 8流,它将非常简单有效,如下所示,只需为Country定义简单的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);