क्या आईएसओ 3166-1 देश कोड का एक ओपन सोर्स जावा एनम है


83

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


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

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

जवाबों:


110

अब जावा कोड के रूप में देश कोड ( आईएसओ 3166-1 अल्फा -2 / अल्फा -3 / न्यूमेरिक ) सूची का कार्यान्वयन एपाचे लाइसेंस संस्करण 2.0 के तहत गिटहब में उपलब्ध है।

उदाहरण:

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 को अन्य Java enums, LanguageCode ( ISO 639-1 ), LanguageAlpha3Code ( ISO 639-2 ), LocaleCode, ScriptCode ( ISO 15924 ) और CurrencyCode ( ISO 4217 ) में पंजीकृत किया गया और Maven Central में पंजीकृत किया गया। भंडार।

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"

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

हाय ब्रूनो! लापता प्रविष्टियों (AL, AN और GN) को खोजने के लिए धन्यवाद। मैंने आपके forked repository का उल्लेख किया और मैन्युअल रूप से उन्हें मेरे repository में कॉपी किया। धन्यवाद!
ताकाहिको कावासाकी

इस पुस्तकालय के लिए बहुत बहुत धन्यवाद ।
मैट बॉल

यदि आप बैंकिंग सामान कर रहे हैं, तो IBAN और BIC कोड को संभालने के लिए " iban4j " (नाम स्थान org.iban4j) नामक एक अपाचे-2-लाइसेंस प्राप्त पुस्तकालय है और इसमें कंट्रीकोड
एनम

54

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

String[] countryCodes = Locale.getISOCountries();

यद्यपि आईएसओ वेबसाइट का दावा है कि 249 आईएसओ 3166-1-अल्फा -2 कोड तत्व हैं , हालांकि जेवाडॉक समान जानकारी से लिंक करता है।


7
यह जानकारी हार्डकोड है। आपको अपडेट रखने के लिए JRE
रेगुलेशन

जावा 7 में 247 देश हैं, फिर भी आधिकारिक मानक (जो कि 249 है) से कम है।
जैगर

2
जो लापता हैं, वे हैं: साउथ सुदना (एसएस) और सैंट MAARTEN (DUTCH PART) (SX)
जैगर

Java 1.6.0_33-b05248 शामिल हैं, केवल SSअब गायब है । यह केवल इसलिए SSहै क्योंकि हाल ही में (2011) देश को जोड़ा गया है और जावा 6 स्रोत को अपडेट नहीं किया गया है।
एंडीब

1
ओपी "स्वतंत्र रूप से उपलब्ध जावा 1.5 पैकेज" के लिए पूछ रहा है: जावा 6 या जावा 7 का अनुरोध करने वाला उत्तर उस पर कैसे लागू होता है? Downvoted।
ब्रूनो बोसोला

11

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

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

intellitxt
NimChimpsky

2
वह कोई एनम नहीं है।
डेविड

@ यह एक Enum के शरीर को उत्पन्न करता है
Bozho

1
अच्छा पीढ़ी कोड, लेकिन आपको विशेष वर्णों को निकालने की आवश्यकता है। उदाहरण के लिए C cannotTE_D'IVOIRE का उपयोग एनम के रूप में नहीं किया जा सकता है: P।
जेकब वैन लिंगेन

9

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

यदि मैं केवल जावा लोकलाइज़ेशन पर भरोसा करूं तो मैं इसका उपयोग कैसे करूंगा:

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

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


4

भाषा के नाम के साथ इस एनम को उत्पन्न करने का एक आसान तरीका है। चिपकाने के लिए 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) + "\"),");
  }
 }

इससे आपको देशों की नहीं बल्कि भाषाओं की सूची मिलती है।
gerdemb


1

अगर कोई पहले से ही अमेजन AWS SDK का उपयोग कर रहा है तो उसमें शामिल है com.amazonaws.services.route53domains.model.CountryCode। मुझे पता है कि यह आदर्श नहीं है, लेकिन यह एक विकल्प है यदि आप पहले से ही एडब्ल्यूएस एसडीके का उपयोग करते हैं। ज्यादातर मामलों में, मैं ताकाहिको का उपयोग करूंगा nv-i18n, क्योंकि वह उल्लेख करता है, यह आईएसओ 3166-1 लागू करता है।



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

जहां डेटाटेक्स्ट फ़ाइल विकिपीडिया तालिका से एक सरल कॉपी और पेस्ट है (बस सभी अतिरिक्त लाइनों को हटा दें, यह सुनिश्चित करें कि आपके पास एक देश कोड और देश का नाम प्रति पंक्ति है)।

फिर इसे अपने स्थिर वर्ग में रखें:

/**
 * 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! ...
         //
}

0

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

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

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

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


0

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

लोकेल से आप उन सभी जानकारियों को प्राप्त कर सकते हैं, जिनका उपयोग आप 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;
    }

समर्थक:

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

कोन:

  • मावेन भंडार में नहीं
  • सबसे अधिक संभावना अन्य समाधानों की तुलना में सरल / कम अभिव्यंजक है, जो मुझे नहीं पता है।
  • मेरी खुद की जरूरतों के लिए बनाया गया है / इस तरह के रखरखाव के रूप में नहीं। - आपको संभवतः रेपो को क्लोन करना चाहिए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.