2015-04-04 49 views
1

我attemping填充的JComboBox與城市的名字。返回從一個HashMap的所有按鍵withou循環

我的程序有一個名爲「國家」級。 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的字符串數組?我嘗試以下,但它沒有工作:

Country country 1 = new Country(); 

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

這將返回市對象的數組,但我不知道如何與這個使用市GetName方法結合進行。

+0

重複的http://stackoverflow.com/questions/3293946/the-easiest-way-to-transform-collection-to-array – skozlov 2015-04-04 11:20:33

+0

不要認爲這是重複的 - 他們是清楚相關的,但這個問題是關於將特定類型的集合轉換爲包含原始集合的屬性而不是集合本身的數組。 – 2015-04-04 11:26:13

+0

@ user3371750請閱讀[我應該怎麼做當有人回答我的問題](http://stackoverflow.com/help/someone-answers) – CKing 2017-01-28 07:26:01

回答

0

您可以將地圖鍵CITYNAME然後做下面讓名稱。

cities.keySet(); 
1

你不能避免循環。要麼你會循環,要麼Java會在後臺循環。

你能避免自己寫循環,如果在你的地圖鍵是城市名稱。然後,您只能從地圖上詢問.keySet()。但是,即使在這種情況下,Java也會在後臺循環並複製密鑰。

另一種方法是,你循環,但藏在一些方法中的循環(可以說getCitiesArray())在類。所以,你可以在調用方法中做country1.getCitiesArray();。代碼看起來會更好,並且更易於閱讀,但是您仍然需要在課程內部有循環。

+1

第二個建議。對於Java 8,'getCitiesArray()'方法可能是'return getCities()。stream()。map(City :: getName).toArray(String [] :: new);' – 2015-04-04 11:34:20

0

如果您使用的是Java 8中,您可以使用Stream API到城市的名稱映射到一個字符串:

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

不幸的是,JComboBox構造函數不接受一個列表作爲參數,但你可以改變它爲'.toArray(String [] :: new);'而不是'collect(toList());'因爲OP想要一個數組 – 2015-04-04 11:38:36

+0

....或'.collect (toCollection(Vector :: new)''但IMO的數組更好,因爲'Vector'類已經過時了。 – 2015-04-04 11:41:38

+0

@AlexisC。感謝您的評論。我認爲將List轉換爲數組本應該是直截了當的,但您的建議看起來更優雅。 – CKing 2015-04-04 11:41:57

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和也等於。