2008-09-26 83 views
54

有沒有人知道免費提供的java 1.5包,它提供了一個ISO 3166-1國家代碼列表作爲enum或EnumMap?具體而言,我需要「ISO 3166-1-alpha-2代碼元素」,即「us」,「uk」,「de」等2個字符的國家代碼。創建一個足夠簡單(儘管乏味),但如果有一個標準的已經出現在阿帕奇地區或類似的地方,這將節省一點時間。是否有ISO 3166-1國家代碼的開源java枚舉

+3

請注意,英國的ISO 3166-1-alpha-2是GB而不是英國,因爲您的問題。 – 2013-03-25 16:51:21

+1

@Ken是的,你可以,但你必須保持該列表,並保持與維基百科同步。問題增加... – jontejj 2015-02-12 10:05:43

回答

37

這段代碼獲得242個國家的Sun Java 6:

String[] countryCodes = Locale.getISOCountries(); 

雖然the ISO website索賠有249 ISO 3166-1-α-2碼元,雖然javadoc鏈接到相同的信息。

+7

這些信息是硬編碼的。您需要定期更新JRE以保持更新:) – BalusC 2010-02-19 18:09:04

+0

在Java 7中,有247個國家,仍低於官方標準(249)。 – Jagger 2012-02-28 17:04:12

+1

缺少的是:南蘇丹(SS)和SINT MAARTEN(荷蘭零件)(SX) – Jagger 2012-02-28 17:09:32

2

有一種簡單的方法可以用語言名稱生成這個枚舉。 執行該代碼來生成枚舉字段列表貼:

/** 
    * This is the code used to generate the enum content 
    */ 
public static void main(String[] args) { 
    String[] codes = java.util.Locale.getISOLanguages(); 
    for (String isoCode: codes) { 
    Locale locale = new Locale(isoCode); 
    System.out.println(isoCode.toUpperCase() + "(\"" + locale.getDisplayLanguage(locale) + "\"),"); 
    } 
} 
7

下面是如何產生與國家代碼+國家名稱的枚舉:

package countryenum; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.List; 
import java.util.Locale; 

public class CountryEnumGenerator { 
    public static void main(String[] args) { 
     String[] countryCodes = Locale.getISOCountries(); 
     List<Country> list = new ArrayList<Country>(countryCodes.length); 

     for (String cc : countryCodes) { 
      list.add(new Country(cc.toUpperCase(), new Locale("", cc).getDisplayCountry())); 
     } 

     Collections.sort(list); 

     for (Country c : list) { 
      System.out.println("/**" + c.getName() + "*/"); 
      System.out.println(c.getCode() + "(\"" + c.getName() + "\"),"); 
     } 

    } 
} 

class Country implements Comparable<Country> { 
    private String code; 
    private String name; 

    public Country(String code, String name) { 
     super(); 
     this.code = code; 
     this.name = name; 
    } 

    public String getCode() { 
     return code; 
    } 


    public void setCode(String code) { 
     this.code = code; 
    } 


    public String getName() { 
     return name; 
    } 


    public void setName(String name) { 
     this.name = name; 
    } 


    @Override 
    public int compareTo(Country o) { 
     return this.name.compareTo(o.name); 
    } 
} 
0

這仍然沒有回答這個問題。我也在爲此尋找一種調查員,但沒有找到任何東西。這裏使用散列表的一些例子,但代表相同的內置獲取

我會去一個不同的方法。所以,我創建了一個Python腳本來自動生成Java名單:

#!/usr/bin/python 
f = open("data.txt", 'r') 
data = [] 
cc = {} 

for l in f: 
    t = l.split('\t') 
    cc = { 'code': str(t[0]).strip(), 
      'name': str(t[1]).strip() 
    } 
    data.append(cc) 
f.close() 

for c in data: 
    print """ 
/** 
* Defines the <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO_3166-1_alpha-2</a> 
* for <b><i>%(name)s</i></b>. 
* <p> 
* This constant holds the value of <b>{@value}</b>. 
* 
* @since 1.0 
* 
*/ 
public static final String %(code)s = \"%(code)s\";""" % c 

其中data.txt文件是維基百科表的簡單複製粘貼&(只是刪除所有多餘的線條,確保你有一個國家每行代碼和國家名稱)。

,只須將這個到您的靜態類:

/** 
* Holds <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO_3166-1_alpha-2</a> 
* constant values for all countries. 
* 
* @since 1.0 
* 
* </p> 
*/ 
public class CountryCode { 

    /** 
    * Constructor defined as <code>private</code> purposefully to ensure this 
    * class is only used to access its static properties and/or methods. 
    */ 
    private CountryCode() { } 

    /** 
    * Defines the <a href="http://en.wikipedia.org/wiki/ISO_3166-1_alpha-2">ISO_3166-1_alpha-2</a> 
    * for <b><i>Andorra</i></b>. 
    * <p> 
    * This constant holds the value of <b>{@value}</b>. 
    * 
    * @since 1.0 
    * 
    */ 
    public static final String AD = "AD"; 

     // 
     // and the list goes on! ... 
     // 
} 
79

現在的國家代碼(ISO 3166-1alpha-2/alpha-3/numeric)列表作爲Java的枚舉的實現是在Apache許可證2.0版可以在GitHub上。

實施例:

CountryCode cc = CountryCode.getByCode("JP"); 

System.out.println("Country name = " + cc.getName());    // "Japan" 
System.out.println("ISO 3166-1 alpha-2 code = " + cc.getAlpha2()); // "JP" 
System.out.println("ISO 3166-1 alpha-3 code = " + cc.getAlpha3()); // "JPN" 
System.out.println("ISO 3166-1 numeric code = " + cc.getNumeric()); // 392 

最後編輯 2016君09

COUNTRYCODE枚舉包入com.neovisionaries.i18n與其他Java枚舉,語言代碼(ISO 639-1) ,LanguageAlpha3Code(ISO 639-2),LocaleCode,ScriptCode(ISO 15924)和CurrencyCode(ISO 4217)並註冊進入Maven Central Repository。

的Maven

<dependency> 
    <groupId>com.neovisionaries</groupId> 
    <artifactId>nv-i18n</artifactId> 
    <version>1.22</version> 
</dependency> 

搖籃

dependencies { 
    compile 'com.neovisionaries:nv-i18n:1.22' 
} 

的GitHub

https://github.com/TakahikoKawasaki/nv-i18n

的Javadoc

http://takahikokawasaki.github.com/nv-i18n/

OSGi的

Bundle-SymbolicName: com.neovisionaries.i18n 
Export-Package: com.neovisionaries.i18n;version="1.22.0" 
0

我不知道這個問題,直到我最近纔開源我的Java枚舉出於這樣的目的!驚人的巧合!

我把整個源代碼放在我的博客上,並帶有BSD caluse 3許可證,所以我不認爲有人會對此有任何疑問。

可以在這裏找到。 https://subversivebytes.wordpress.com/2013/10/07/java-iso-3166-java-enum/

希望它是有用的,並緩解發展的痛苦。

7

如果您已經將依賴於Java語言環境,那麼我建議使用一個簡單的HashMap,而不是創建新類等國家。

這是我會怎麼使用它,如果我是要依賴於Java本地化只有:

private HashMap<String, String> countries = new HashMap<String, String>(); 
String[] countryCodes = Locale.getISOCountries(); 

for (String cc : countryCodes) { 
    // country name , country code map 
    countries.put(new Locale("", cc).getDisplayCountry(), cc.toUpperCase()); 
} 

填寫地圖後,您可以在需要時從國家/地區獲得ISO代碼。 或者您也可以將其設置爲國家/地區名稱地圖的ISO代碼,只需相應地修改'put'方法即可。

1

如果有人已經在使用亞馬遜AWS SDK,它包括com.amazonaws.services.route53domains.model.CountryCode。我知道這並不理想,但如果您已經使用AWS開發工具包,則可以選擇這種方法。對於大多數情況,我會使用Takahiko的nv-i18n,因爲正如他所說,它實現了ISO 3166-1。

0

我創建了一個枚舉,你用英文國名命名。見country-util
在每個枚舉上,您可以調用getLocale()來獲取Java語言環境。

從語言環境中,您可以獲得您習慣的所有信息,例如ISO-3166-1兩字母國家代碼。

public enum Country{ 

    ANDORRA(new Locale("AD")), 
    AFGHANISTAN(new Locale("AF")), 
    ANTIGUA_AND_BARBUDA(new Locale("AG")), 
    ANGUILLA(new Locale("AI")), 
    //etc 
    ZAMBIA(new Locale("ZM")), 
    ZIMBABWE(new Locale("ZW")); 

    private Locale locale; 

    private Country(Locale locale){ 
     this.locale = locale; 
    } 

    public Locale getLocale(){ 
     return locale; 
    } 

臨:

  • 重量輕
  • 映射到Java的語言環境
  • 尋址通過全國名
  • 枚舉值不被硬編碼的,而是靠Locale.getISOCountries調用生成()。那就是:簡單地重新編譯項目與最新的java版本,以便對枚舉中反映的國家列表進行任何更改。

缺點:

  • 不能在Maven倉庫
  • 最有可能的簡單/比其他解決方案,我不知道少的表現。
  • 爲我自己的需要創建/不保持。 - 你應該克隆回購。