从HashMap返回所有键而不循环

时间:2015-04-04 11:18:20

标签: java collections

我正在尝试使用城市名称填充JComboBox。

我的程序有一个名为“Country”的类。 Country对象包含一个名为'City'的对象的HashMap,其方法为getName,返回一个String值。

public class Country {

    private final Map<String, City> cities = new HashMap<>();

    public Collection<City> getCities() {
        return cities.values();
    }

}

public class City {

    String cityName;

    public String getName() {
        return cityName;
    }

}

是否可以在不使用循环的情况下返回cityName的String数组?我正在尝试以下但它没有用:

Country country 1 = new Country();

String[] cityNames = country1.getCities().toArray();
JComboBox cityChoice = new JComboBox(cityNames);

这会返回一个City对象数组,但是我不知道如何将City getName方法与此结合使用。

4 个答案:

答案 0 :(得分:1)

你无法避免循环。要么循环,要么Java将在后台循环。

如果地图中的键是城市名称,则可以避免编写自己的循环。然后,您只能从地图中询问.keySet()。但是,即使在这种情况下,Java也会在后台循环并复制密钥。

其他方式是你循环,但在类中的某些方法(比如getCitiesArray())中隐藏循环。因此,您可以在调用方法中执行country1.getCitiesArray();。代码看起来会更好并且更容易阅读,但是你仍然需要在类中包含循环。

答案 1 :(得分:0)

您可以将Map键存储为CityName,然后执行以下操作以获取名称。

cities.keySet();

答案 2 :(得分:0)

如果您使用的是Java 8,则可以使用Stream API将城市名称映射到字符串:

String []cityNames = country1.getCities().stream().map(City::getName).toArray(String[]::new);

答案 3 :(得分:0)

城市对象可以直接在组合框中使用,但有一些小的改动。

public class City {

    String cityName;

    public String getName() {
        return cityName;
    }

    @Override
    public String toString() {
        return getName();
    }

 }

然后是人口代码

Country country1 = new Country();

City[] cities = country1.getCities().toArray();
JComboBox<City> cityChoice = new JComboBox<City>(cities);

您应该覆盖hashCode并等于。