Monday, March 30, 2009

Getting Countries list in Java

Most modern web applications need to show somewhere a dropdown or a list containing all countries. Getting the list of all countries is solved in all sort of ways:

  • Building a database table containing all countries.
  • Storing all list of countries in a file.
  • Build a hard coded list or array of all countries.

One additional way, is using java to get all list of countries. The benefit of using Java to do the Job, is that Java can produce the list of countries in any desired language. This is good for internationalized web applications. Another good reason, is maintenance. On each new release the data is kept updated. Country names and and country codes are not changed and added often, but changes do happen from time to time and it is best to be updated with no effort.

The list of countries can be generated by calling the method of Locale class: getISOCountries(). This method returns string array all all the exiting country codes in ISO 3116-1 alpha-2 (2 letter) standard.

From this list it is very easy to create Locales for all countries. By calling the Locale method: getDisplayCountry(), the name of the country can be retrieved. Calling this method with a given Locale returns the name of the country in the specific language of the locale. By the way, I noted that Java did not implemented completely the getDisplayCountry() for all languages. For example, if you would like to get the list of countries in Hebrew, the only country that is returned actually in Hebrew is Israel. I believe that over time Java will include translations for all languages.

After generating list of countries for a specific language, we will sort the list. Of course that the list will be sorted according to the chosen language.

We will use a basic Country class for representing a single country, this class has only 2 members: country code and name:

public class Country {
    private String countryCode;
    private String name;
    public Country(String countryCode, String name)
    {
        this.countryCode = countryCode;
        this.name = name;
    }
    public String getCountryCode() {
        return countryCode;
    }
    public void setCountryCode(String countryCode) {
        this.countryCode = countryCode;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String toString()
    {
        return countryCode + ", " + name;
    }
}

And the CountryUtil class for generating list of countries for a specifc language.

This class has 2 methods:

  • getCountries: This method returns list of Country objects of all countries in a specific desired language (Locale).
  • getCountriesMap: This method returns a Map of all countries in a specific desired languages (Locale). The key of the map is the countryCode and the values is the name of the country. A map can be useful if you would like to get a country by its code. Note that in order to construct the Map the class: LinkedHashMap is used. This is done in order to preserve the sort order of the list.

This is the CountryUtil class:

package com.bashan.blog;
import java.util.*;
public class CountryUtil {
  public static List<Country> getCountries(final Locale inLocale) {
    String[] countryCodes = Locale.getISOCountries();
    List<Country> countries = new ArrayList<Country>(countryCodes.length);
    for (String countryCode : countryCodes) {
      countries.add(new Country(countryCode, new Locale("", countryCode).getDisplayCountry(inLocale)));
    }
    Collections.sort(countries, new Comparator<Country>() {
      public int compare(Country c1, Country c2) {
        return c1.getName().compareTo(c2.getName());
      }
    });
    return countries;
  }
  public static Map<String, String> getCountriesMap(final Locale inLocale) {
    List<Country> countries = getCountries(inLocale);
    Map<String, String> countriesMap = new LinkedHashMap<String, String>(countries.size());
    for (Country country : countries) {
      countriesMap.put(country.getCountryCode(), country.getName());
    }
    return countriesMap;
  }
  public static void printCounties(List<Country> countries) {
    for (Country country : countries) {
      System.out.println(country);
    }
  }
  public static void main(String[] args) {
    // Get list of countries in US English
    System.out.println("---- List of countries in English ----");
    List<Country> countries = getCountries(Locale.US);
    printCounties(countries);
    System.out.println("---- List of countries in Japanese ----");
    // Get list of countries in Japanese
    countries = getCountries(Locale.JAPANESE);
    printCounties(countries);
  }
}
On the bottom of the class you can notice a small testing program that outputs all countries in English and in Japanese. This is how the output looks like:
---- List of countries in English ----
AF, Afghanistan
AL, Albania
DZ, Algeria
AS, American Samoa
AD, Andorra
AO, Angola
AI, Anguilla
AQ, Antarctica
AG, Antigua and Barbuda
AR, Argentina
AM, Armenia
AW, Aruba
AU, Australia
AT, Austria
AZ, Azerbaijan
BS, Bahamas
BH, Bahrain
BD, Bangladesh
BB, Barbados
BY, Belarus
BE, Belgium
BZ, Belize
BJ, Benin
BM, Bermuda
BT, Bhutan
BO, Bolivia
BA, Bosnia and Herzegovina
BW, Botswana
BV, Bouvet Island
BR, Brazil
IO, British Indian Ocean Territory
VG, British Virgin Islands
BN, Brunei
BG, Bulgaria
BF, Burkina Faso
BI, Burundi
KH, Cambodia
CM, Cameroon
CA, Canada
CV, Cape Verde
KY, Cayman Islands
CF, Central African Republic
TD, Chad
CL, Chile
CN, China
CX, Christmas Island
CC, Cocos Islands
CO, Colombia
KM, Comoros
CG, Congo
CK, Cook Islands
CR, Costa Rica
HR, Croatia
CU, Cuba
CY, Cyprus
CZ, Czech Republic
CI, Côte d'Ivoire
DK, Denmark
DJ, Djibouti
DM, Dominica
DO, Dominican Republic
EC, Ecuador
EG, Egypt
SV, El Salvador
GQ, Equatorial Guinea
ER, Eritrea
EE, Estonia
ET, Ethiopia
FK, Falkland Islands
FO, Faroe Islands
FJ, Fiji
FI, Finland
FR, France
GF, French Guiana
PF, French Polynesia
TF, French Southern Territories
GA, Gabon
GM, Gambia
GE, Georgia
DE, Germany
GH, Ghana
GI, Gibraltar
GR, Greece
GL, Greenland
GD, Grenada
GP, Guadeloupe
GU, Guam
GT, Guatemala
GN, Guinea
GW, Guinea-Bissau
GY, Guyana
HT, Haiti
HM, Heard Island And McDonald Islands
HN, Honduras
HK, Hong Kong
HU, Hungary
IS, Iceland
IN, India
ID, Indonesia
IR, Iran
IQ, Iraq
IE, Ireland
IL, Israel
IT, Italy
JM, Jamaica
JP, Japan
JO, Jordan
KZ, Kazakhstan
KE, Kenya
KI, Kiribati
KW, Kuwait
KG, Kyrgyzstan
LA, Laos
LV, Latvia
LB, Lebanon
LS, Lesotho
LR, Liberia
LY, Libya
LI, Liechtenstein
LT, Lithuania
LU, Luxembourg
MO, Macao
MK, Macedonia
MG, Madagascar
MW, Malawi
MY, Malaysia
MV, Maldives
ML, Mali
MT, Malta
MH, Marshall Islands
MQ, Martinique
MR, Mauritania
MU, Mauritius
YT, Mayotte
MX, Mexico
FM, Micronesia
MD, Moldova
MC, Monaco
MN, Mongolia
ME, Montenegro
MS, Montserrat
MA, Morocco
MZ, Mozambique
MM, Myanmar
NA, Namibia
NR, Nauru
NP, Nepal
NL, Netherlands
AN, Netherlands Antilles
NC, New Caledonia
NZ, New Zealand
NI, Nicaragua
NE, Niger
NG, Nigeria
NU, Niue
NF, Norfolk Island
KP, North Korea
MP, Northern Mariana Islands
NO, Norway
OM, Oman
PK, Pakistan
PW, Palau
PS, Palestine
PA, Panama
PG, Papua New Guinea
PY, Paraguay
PE, Peru
PH, Philippines
PN, Pitcairn
PL, Poland
PT, Portugal
PR, Puerto Rico
QA, Qatar
RE, Reunion
RO, Romania
RU, Russia
RW, Rwanda
SH, Saint Helena
KN, Saint Kitts And Nevis
LC, Saint Lucia
PM, Saint Pierre And Miquelon
VC, Saint Vincent And The Grenadines
WS, Samoa
SM, San Marino
ST, Sao Tome And Principe
SA, Saudi Arabia
SN, Senegal
RS, Serbia
CS, Serbia and Montenegro
SC, Seychelles
SL, Sierra Leone
SG, Singapore
SK, Slovakia
SI, Slovenia
SB, Solomon Islands
SO, Somalia
ZA, South Africa
GS, South Georgia And The South Sandwich Islands
KR, South Korea
ES, Spain
LK, Sri Lanka
SD, Sudan
SR, Suriname
SJ, Svalbard And Jan Mayen
SZ, Swaziland
SE, Sweden
CH, Switzerland
SY, Syria
TW, Taiwan
TJ, Tajikistan
TZ, Tanzania
TH, Thailand
CD, The Democratic Republic Of Congo
TL, Timor-Leste
TG, Togo
TK, Tokelau
TO, Tonga
TT, Trinidad and Tobago
TN, Tunisia
TR, Turkey
TM, Turkmenistan
TC, Turks And Caicos Islands
TV, Tuvalu
VI, U.S. Virgin Islands
UG, Uganda
UA, Ukraine
AE, United Arab Emirates
GB, United Kingdom
US, United States
UM, United States Minor Outlying Islands
UY, Uruguay
UZ, Uzbekistan
VU, Vanuatu
VA, Vatican
VE, Venezuela
VN, Vietnam
WF, Wallis And Futuna
EH, Western Sahara
YE, Yemen
ZM, Zambia
ZW, Zimbabwe
AX, Åland Islands

---- List of countries in Japanese ----

IS, アイスランド
IE, アイルランド
AZ, アゼルバイジャン
AF, アフガニスタン
AS, アメリカンサモア
US, アメリカ合衆国
AE, アラブ首長国連邦
DZ, アルジェリア
AR, アルゼンチン
AL, アルバニア
AW, アルバ島
AM, アルメニア
AI, アンギラ
AO, アンゴラ
AG, アンチグアバーブーダ
AD, アンドラ
YE, イエメン
GB, イギリス
IL, イスラエル
IT, イタリア
IQ, イラク
IR, イラン
IN, インド
ID, インドネシア
UG, ウガンダ
UA, ウクライナ
UZ, ウズベキスタン
UY, ウルグアイ
EC, エクアドル
EG, エジプト
EE, エストニア
ET, エチオピア
ER, エリトリア
SV, エルサルバドル
OM, オマーン
NL, オランダ
AN, オランダ領アンティル諸島
AU, オーストラリア
AT, オーストリア
AX, オーランド諸島
KZ, カザフスタン
QA, カタール
CA, カナダ
CM, カメルーン
KH, カンボジア
CV, カーボベルデ
GY, ガイアナ
GA, ガボン
GM, ガンビア
GH, ガーナ
CY, キプロス
CU, キューバ
KI, キリバス
KG, キルギスタン
GN, ギニア
GW, ギニアビサウ
GR, ギリシア
KW, クウェート
CK, クック諸島
CX, クリスマス島
HR, クロアチア
GT, グアテマラ
GP, グアドループ
GU, グアム
GL, グリーンランド
GE, グルジア
GD, グレナダ
KY, ケイマン諸島
KE, ケニア
CC, ココス諸島
CR, コスタリカ
KM, コモロ
CO, コロンビア
CG, コンゴ
CD, コンゴ民主共和国
CI, コートジボアール
SA, サウジアラビア
GS, サウスジョージア島・サウスサンドウィッチ島
ST, サントメ・プリンシペ
PM, サンピエール島・ミクロン島
SM, サンマリノ
ZM, ザンビア
SL, シエラレオネ
SY, シリア
SG, シンガポール
DJ, ジブチ
GI, ジブラルタル
JM, ジャマイカ
ZW, ジンバブエ
CH, スイス
SE, スウェーデン
SJ, スバールバル諸島・ヤンマイエン島
ES, スペイン
SR, スリナム
LK, スリランカ
SK, スロバキア
SI, スロベニア
SZ, スワジランド
SD, スーダン
SC, セイシェル
SN, セネガル
RS, セルビア
CS, セルビア・モンテネグロ
KN, セントクリストファー・ネイビス
VC, セントビンセントおよびグレナディーン諸島
SH, セントヘレナ島
LC, セントルシア
SO, ソマリア
SB, ソロモン諸島
TH, タイ
TJ, タジキスタン
TZ, タンザニア
TC, タークス諸島・カイコス諸島
CZ, チェコ
TD, チャド
TN, チュニジア
CL, チリ
TV, ツバル
DK, デンマーク
TK, トケラウ諸島
TT, トリニダード・トバゴ
TM, トルクメニスタン
TR, トルコ
TO, トンガ
TG, トーゴ
DE, ドイツ
DO, ドミニカ共和国
DM, ドミニカ国
NG, ナイジェリア
NR, ナウル
NA, ナミビア
NU, ニウエ島
NI, ニカラグア
NE, ニジェール
NC, ニューカレドニア
NZ, ニュージーランド
NP, ネパール
NO, ノルウェー
NF, ノーフォーク島
HT, ハイチ
HU, ハンガリー
HM, ハード・マクドナルド諸島
VA, バチカン
VU, バヌアツ
BS, バハマ
BB, バルバドス
BD, バングラデシュ
BM, バーミューダ諸島
BH, バーレーン
PK, パキスタン
PA, パナマ
PG, パプアニューギニア
PW, パラオ
PY, パラグアイ
PS, パレスチナ
PN, ピトケアン島
FJ, フィジー
PH, フィリピン
FI, フィンランド
FO, フェロー諸島
FK, フォークランド諸島
FR, フランス
TF, フランス領極南諸島
BR, ブラジル
BG, ブルガリア
BF, ブルキナファソ
BN, ブルネイ
BI, ブルンジ
BT, ブータン
BV, ブーベ島
PR, プエルトリコ
VN, ベトナム
BJ, ベニン
VE, ベネズエラ
BY, ベラルーシ
BZ, ベリーズ
BE, ベルギー
PE, ペルー
HN, ホンジュラス
BA, ボスニア・ヘルツェゴビナ
BW, ボツワナ
BO, ボリビア
PT, ポルトガル
PL, ポーランド
MO, マカオ
MK, マケドニア
MG, マダガスカル
YT, マヨット島
MW, マラウイ
ML, マリ
MT, マルタ
MQ, マルティニーク島
MY, マレーシア
MH, マーシャル諸島
FM, ミクロネシア
MM, ミャンマー
MX, メキシコ
MZ, モザンビーク
MC, モナコ
MV, モルディブ
MD, モルドバ
MA, モロッコ
MN, モンゴル
ME, モンテネグロ
MS, モントセラト島
MU, モーリシャス
MR, モーリタニア
JO, ヨルダン
LA, ラオス
LV, ラトビア
LT, リトアニア
LI, リヒテンシュタイン
LY, リビア
LR, リベリア
LU, ルクセンブルク
RW, ルワンダ
RO, ルーマニア
LS, レソト
LB, レバノン
RE, レユニオン
RU, ロシア
WF, ワリス・フテュナ諸島
CF, 中央アフリカ共和国
CN, 中華人民共和国
GF, 仏領ギアナ
PF, 仏領ポリネシア
MP, 北マリアナ諸島
ZA, 南アフリカ
AQ, 南極
TW, 台湾
KR, 大韓民国
JP, 日本
KP, 朝鮮民主主義人民共和国
TL, 東ティモール
VI, 米領バージン諸島
UM, 米領太平洋諸島
IO, 英領インド洋地域
VG, 英領バージン諸島
EH, 西サハラ
WS, 西サモア
GQ, 赤道ギニア
HK, 香港