2008-09-26 42 views
54

का कोई ओपन सोर्स जावा एनम है क्या कोई भी स्वतंत्र रूप से उपलब्ध जावा 1.5 पैकेज के बारे में जानता है जो आईएसओ 3166-1 देश कोड को एनम या एनमैप के रूप में सूचीबद्ध करता है? विशेष रूप से मुझे "आईएसओ 3166-1-अल्फा -2 कोड तत्व" की आवश्यकता होती है, यानी 2 अक्षर देश कोड जैसे "हमें", "यूके", "डी" इत्यादि। एक बनाना बहुत आसान है (हालांकि थकाऊ), लेकिन अगर Apache भूमि में पहले से ही एक मानक एक बाहर है या जैसे यह थोड़ा सा बचाएगा।क्या आईएसओ 3166-1 देश कोड

+3

ध्यान दें कि ग्रेट ब्रिटेन के लिए आईएसओ 3166-1-अल्फा -2 आपके प्रश्न में यूके नहीं है। –

+1

@ केन हां आप कर सकते हैं लेकिन फिर आपको उस सूची को बनाए रखना होगा और इसे विकिपीडिया के साथ समन्वयित रखना होगा। समस्या बढ़ती है ... – jontejj

उत्तर

37

इस कोड को सन जावा 6 में 242 देशों हो जाता है:

String[] countryCodes = Locale.getISOCountries(); 

the ISO website हालांकि दावा है, 249 ISO 3166-1-अल्फा -2 कोड तत्वों देखते हैं, हालांकि एक ही जानकारी को javadoc लिंक।

+7

यह जानकारी हार्डकोड है। अद्यतन रखने के लिए आपको जेआरई नियामक को अद्यतन करने की आवश्यकता होगी :) – BalusC

+0

जावा 7 में 247 देश हैं, जो अभी भी आधिकारिक मानक (जो 24 9 है) से कम हैं। – Jagger

+1

गायब हैं: दक्षिण सुदान (एसएस) और सिंट मार्टन (डच पार्ट) (एसएक्स) – Jagger

2

भाषा नाम के साथ इस enum को उत्पन्न करने का एक आसान तरीका है। इस कोड को निष्पादित चिपकाने के लिए enum फ़ील्ड की सूची उत्पन्न करने के लिए:

/** 
    * 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) + "\"),"); 
    } 
} 
+0

यह आपको भाषाओं की सूची देता है, न कि देश। – user27478

7

यहाँ कैसे मैं के साथ देश कोड + देश का नाम एक enum उत्पन्न है:

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

ने इंटेलिटक्स्ट – NimChimpsky

+1

को सक्षम करने के लिए प्रिंट में एक पंक्ति जोड़ा जो कि एक enum नहीं है। – David

+0

@ डेविड यह एक enum – Bozho

0

यह अभी भी सवाल का जवाब नहीं है। मैं इसके लिए एक प्रकार का गणक भी ढूंढ रहा था, और कुछ भी नहीं मिला। यहां हैशटेबल का उपयोग करने वाले कुछ उदाहरण, लेकिन अंतर्निहित के रूप में इसका प्रतिनिधित्व करते हैं

मैं एक अलग दृष्टिकोण के लिए जाऊंगा। इसलिए मैं अजगर में कोई स्क्रिप्ट बनाने के लिए स्वचालित रूप से जावा में सूची उत्पन्न करने के:

#!/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

अब जावा enum के रूप में देश कोड (ISO 3166-1alpha-2/alpha-3/numeric) सूची के एक कार्यान्वयन अपाचे लाइसेंस संस्करण 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 enum अन्य जावा enums के साथ com.neovisionaries.i18n में पैक किया गया था, LanguageCode (ISO 639-1) , LanguageAlpha3Code (ISO 639-2), लोकेलकोड, स्क्रिप्टकोड (ISO 15924) और मुद्राकोड (ISO 4217) और पंजीकृत मेवेन सेंट्रल रिपोजिटरी में।

Maven

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

Gradle

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

GitHub

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

जावाडोक

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

OSGi

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

हाय Takahiko इसके लिए धन्यवाद! मैंने अभी तीन लापता देशों को जोड़ा है, खेद है कि मैं जल्दी में था और मैंने सिर्फ रेपो को फोर्क किया था, आपको यहां अपडेट मिलेगा: https://github.com/bbossola/CountryCode –

+0

हाय ब्रूनो! लापता प्रविष्टियों (एएल, एएन और जीएन) खोजने के लिए धन्यवाद। मैंने आपके फोर्कड रिपॉजिटरी को संदर्भित किया और मैन्युअल रूप से उन्हें मेरे भंडार में कॉपी किया। धन्यवाद! इस पुस्तकालय के लिए –

+0

धन्यवाद _so much_। –

0

मैं जब तक मैं अभी हाल ही में वास्तव में इस उद्देश्य के लिए मुक्त-स्रोत मेरी जावा enum था इस सवाल के बारे में पता नहीं था! अद्भुत संयोग!

मैंने बीएसडी कैल्यूज 3 लाइसेंस के साथ अपने ब्लॉग पर पूरा स्रोत कोड डाल दिया है, इसलिए मुझे नहीं लगता कि किसी के बारे में कोई भी गोमांस होगा।

यहां पाया जा सकता है। https://subversivebytes.wordpress.com/2013/10/07/java-iso-3166-java-enum/

आशा है कि यह उपयोगी है और विकास के दर्द को आसान बनाता है।

+2

आपकी सूची में इज़राइल गायब है ... – Alicia

7

आप पहले से ही जावा स्थान पर भरोसा करने की, तो मैं देशों आदि के लिए एक सरल HashMap उपयोग करने का सुझाव बजाय बनाने नए वर्गों जा रहे हैं

यहाँ कैसे मैं इसे का प्रयोग करेंगे अगर मैं जावा स्थानीयकरण पर भरोसा करने के लिए गए थे है केवल:

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()); 
} 

के बाद आप नक्शे को भरने, आप जब भी इसकी आवश्यकता है देश के नाम से आईएसओ कोड प्राप्त कर सकते हैं। या आप इसे देश के नाम मानचित्र पर भी एक आईएसओ कोड बना सकते हैं, तदनुसार 'put' विधि को संशोधित करें।

0

नहीं एक जावा enum, लेकिन किसी को पहले से ही SDK यह com.amazonaws.services.route53domains.model.CountryCode शामिल अमेज़न एडब्ल्यूएस उपयोग कर रहा है इस बात का एक JSON संस्करण http://country.io/names.json

1

पर उपलब्ध है। मुझे पता है कि यह आदर्श नहीं है लेकिन यह एक विकल्प है यदि आप पहले से ही एडब्ल्यूएस एसडीके का उपयोग करते हैं। ज्यादातर मामलों के लिए मैं Takahiko के nv-i18n का उपयोग करता हूं, जैसा कि उन्होंने उल्लेख किया है, यह आईएसओ 3166-1 लागू करता है।

0

मैंने एक enum बनाया है, जिसे आप अंग्रेजी देश के नाम से संबोधित करते हैं। country-util देखें।
प्रत्येक एनम पर आप जावा लोकेल प्राप्त करने के लिए getLocale() पर कॉल कर सकते हैं।

लोकेल से आप सभी जानकारी प्राप्त कर सकते हैं जिनका उपयोग आप किया जाता है, आईएसओ -3166-1 दो अक्षर देश कोड fx।

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; 
    } 

प्रो:

  • प्रकाश वजन
  • जावा स्थलों के लिए नक्शे
  • एड्रेसेबल पूरा देश नाम से
  • Enum मान hardcoded नहीं हैं, लेकिन Locale.getISOCountries के लिए एक कॉल द्वारा उत्पन्न()। यही है: enum में परिलक्षित देशों की सूची में किए गए किसी भी बदलाव के लिए नवीनतम जावा संस्करण के खिलाफ परियोजना को बस पुन: संकलित करें।

कोन:

  • नहीं Maven भंडार में
  • सबसे अधिक संभावना सरल/अन्य समाधान है, जो मैं नहीं जानता कि कम से कम अर्थपूर्ण।
  • अपनी खुद की जरूरतों के लिए बनाया गया/जैसा कि बनाए रखा गया है। - आपको शायद रेपो क्लोन करना चाहिए।
संबंधित मुद्दे