Có mã nguồn mở java enum của mã quốc gia ISO 3166-1 không


83

Có ai biết gói java 1.5 miễn phí có sẵn cung cấp danh sách mã quốc gia ISO 3166-1 dưới dạng enum hoặc EnumMap không? Cụ thể, tôi cần "phần tử mã ISO 3166-1-alpha-2", tức là mã quốc gia 2 ký tự như "chúng tôi", "uk", "de", v.v. Tạo một phần tử đơn giản đủ (mặc dù tẻ nhạt), nhưng nếu có một tiêu chuẩn đã có sẵn trên đất apache hoặc tương tự như vậy sẽ tiết kiệm một chút thời gian.


3
Lưu ý rằng ISO 3166-1-alpha-2 cho Vương quốc Anh là GB không phải Vương quốc Anh như trong câu hỏi của bạn.
Adrian Smith

1
@Ken vâng bạn có thể nhưng sau đó bạn phải duy trì danh sách đó và giữ nó đồng bộ với wikipedia. Vấn đề ngày càng phát triển ...
jontejj 12/02/15

Câu trả lời:


110

Giờ đây, danh sách triển khai mã quốc gia ( ISO 3166-1 alpha-2 / alpha-3 / numeric ) dưới dạng Java enum đã có sẵn tại GitHub theo Giấy phép Apache phiên bản 2.0.

Thí dụ:

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

Chỉnh sửa lần cuối 2016-Tháng 6-09

CountryCode enum được đóng gói thành com.neovisionaries.i18n với các enums Java khác, LanguageCode ( ISO 639-1 ), LanguageAlpha3Code ( ISO 639-2 ), LocaleCode, ScriptCode ( ISO 15924 ) và CurrencyCode ( ISO 4217 ) và được đăng ký vào Maven Central Kho.

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

Javadoc

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

OSGi

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

Xin chào Takahiko, cảm ơn vì điều đó! Tôi chỉ cần thêm ba nước còn thiếu, xin lỗi tôi đã vội vàng và tôi chỉ chia hai repo, bạn sẽ tìm thấy các bản cập nhật ở đây: github.com/bbossola/CountryCode
Bruno Bossola

Chào Bruno! Cảm ơn bạn đã tìm thấy các mục còn thiếu (AL, AN và GN). Tôi đã tham khảo kho lưu trữ được chia nhỏ của bạn và sao chép thủ công chúng vào kho lưu trữ của tôi. Cảm ơn bạn!
Takahiko Kawasaki

Cảm ơn bạn rất nhiều cho thư viện này.
Matt Ball

Trong trường hợp bạn đang làm công cụ ngân hàng, có một thư viện Apache-2 được cấp phép gọi là " iban4j " (namespace org.iban4j) để xử lý mã IBAN và BIC và nó cũng có một enum CountryCode: CountryCode
David Tonhofer

54

Mã này được 242 quốc gia trong Sun Java 6:

String[] countryCodes = Locale.getISOCountries();

Mặc dù trang web của ISO tuyên bố có 249 phần tử mã ISO 3166-1-alpha-2 , mặc dù javadoc liên kết đến cùng một thông tin.


7
Thông tin này được mã hóa cứng. Bạn sẽ cần cập nhật quy định của JRE để luôn cập nhật :)
BalusC

Trong Java 7, có 247 quốc gia, vẫn ít hơn so với tiêu chuẩn chính thức (là 249).
Jagger

2
Những người còn thiếu là: SOUTH SUDAN (SS) và SINT MAARTEN (DUTCH PART) (SX)
Jagger

Java 1.6.0_33-b05bao gồm 248, chỉ bỏ lỡ SSbây giờ. Điều này đơn giản là vì SSlà quốc gia gần đây nhất (2011) được thêm vào và nguồn Java 6 chưa được cập nhật.
andyb

1
OP đang yêu cầu "gói java 1.5 có sẵn miễn phí": câu trả lời yêu cầu Java6 hoặc Java7 áp dụng như thế nào? Bị phản đối.
Bruno Bossola

11

Đây là cách tôi tạo một enum với mã quốc gia + tên quốc gia:

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

thêm một dòng trong in ấn để cho phép IntelliTXT
NimChimpsky

2
Đó không phải là một enum.
David

@ David nó tạo ra cơ thể của một enum
Bozho

1
Mã thế hệ đẹp, nhưng bạn cần xóa các ký tự đặc biệt. Ví dụ: CÔTE_D'IVOIRE không thể được sử dụng như một enum: P.
Jacob van Lingen

9

Nếu bạn đã dựa vào ngôn ngữ Java, thì tôi khuyên bạn nên sử dụng HashMap đơn giản thay vì tạo các lớp mới cho các quốc gia, v.v.

Đây là cách tôi sẽ sử dụng nó nếu tôi chỉ dựa vào Java Localization:

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

Sau khi điền vào bản đồ, bạn có thể lấy mã ISO từ tên quốc gia bất cứ khi nào bạn cần. Hoặc bạn cũng có thể đặt nó thành mã ISO cho bản đồ tên Quốc gia, chỉ cần sửa đổi phương thức 'đặt' cho phù hợp.


4

Có một cách dễ dàng để tạo enum này với tên ngôn ngữ. Thực thi mã này để tạo danh sách các trường enum để dán:

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

Điều này cung cấp cho bạn danh sách các ngôn ngữ, không phải quốc gia.
gerdemb


1

Nếu bất kỳ ai đã sử dụng Amazon AWS SDK thì nó sẽ bao gồm com.amazonaws.services.route53domains.model.CountryCode. Tôi biết điều này không lý tưởng nhưng đó là một giải pháp thay thế nếu bạn đã sử dụng AWS SDK. Đối với hầu hết các trường hợp, tôi sẽ sử dụng Takahiko nv-i18nvì, như anh ấy đã đề cập, nó áp dụng ISO 3166-1.



0

Điều này vẫn không trả lời câu hỏi. Tôi cũng đang tìm kiếm một loại điều tra viên cho việc này, và không tìm thấy bất cứ điều gì. Một số ví dụ sử dụng hashtable ở đây, nhưng đại diện giống như get tích hợp sẵn

Tôi sẽ đi theo một cách tiếp cận khác. Vì vậy, tôi đã tạo một tập lệnh trong python để tự động tạo danh sách trong 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

trong đó tệp data.txt là một bản sao và dán đơn giản từ bảng Wikipedia (chỉ cần xóa tất cả các dòng thừa, đảm bảo bạn có mã quốc gia và tên quốc gia trên mỗi dòng).

Sau đó, chỉ cần đặt nó vào lớp tĩnh của bạn:

/**
 * 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

Tôi không biết về câu hỏi này cho đến khi tôi vừa tạo nguồn mở Java enum của mình cho chính xác mục đích này! Sự trùng hợp đáng kinh ngạc!

Tôi đặt toàn bộ mã nguồn trên blog của mình với giấy phép BSD caluse 3 vì vậy tôi không nghĩ rằng bất kỳ ai sẽ có bất kỳ mối quan tâm nào về nó.

Có thể được tìm thấy ở đây. https://subversivebytes.wordpress.com/2013/10/07/java-iso-3166-java-enum/

Hy vọng nó hữu ích và giảm bớt những khó khăn khi phát triển.


0

Tôi đã tạo một enum, mà bạn gọi bằng tên quốc gia tiếng Anh. Xem quốc gia sử dụng .
Trên mỗi enum bạn có thể gọigetLocale() để lấy Java Locale.

Từ Ngôn ngữ, bạn có thể nhận được tất cả thông tin bạn đã quen, lấy mã quốc gia hai chữ cái 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;
    }

Chuyên nghiệp:

  • Trọng lượng nhẹ
  • Bản đồ tới ngôn ngữ Java
  • Có thể xưng hô bằng tên quốc gia đầy đủ
  • Các giá trị enum không được mã hóa cứng, mà được tạo bởi một lệnh gọi tới Locale.getISOCountries (). Đó là: Đơn giản chỉ cần biên dịch lại dự án so với phiên bản java mới nhất để có bất kỳ thay đổi nào được thực hiện đối với danh sách các quốc gia được phản ánh trong enum.

Con:

  • Không có trong kho lưu trữ Maven
  • Rất có thể đơn giản hơn / ít diễn đạt hơn các giải pháp khác, mà tôi không biết.
  • Được tạo ra cho nhu cầu của riêng tôi / không được duy trì như vậy. - Bạn có thể nên sao chép repo.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.