2013-04-10 17 views
5

假設有一個兩個字符String,它應該代表國家或語言名稱ISO 639更清晰的方式來檢查一個字符串是ISO ISO國家的ISO語言

你知道,Locale類有兩個功能getISOLanguagesgetISOCountries與所有分別爲ISO語言和ISO國家,回報String數組。

要檢查某個特定的String對象是否爲有效的ISO語言或ISO國家/地區,我應該在該陣列內部查看匹配的String。好的,我可以使用二進制搜索(例如Arrays.binarySearch或ApacheCommons ArrayUtils.contains)。

的問題是:存在任何效用(例如,從番石榴阿帕奇百科全書庫),它提供了更清潔的方式,例如返回boolean以驗證String爲有效ISO 639語言或ISO 639國家/地區的功能?

例如:

public static boolean isValidISOLanguage(String s) 
public static boolean isValidISOCountry(String s) 
+0

請記住檢查您的字符串的長度,然後再搜索數組(這種或其他方式) – Dariusz 2013-04-10 08:59:56

+0

當然是的......謝謝! – 2013-04-10 09:00:50

+0

@Dariusz:我不確定我會打擾 - 至少如果做一個哈希查找。除非你期望得到大量的字符串,這需要很長的時間來散列,這似乎是複雜的,沒有證明顯着的好處。 – 2013-04-10 09:02:46

回答

13

我不會理會使用一個二進制搜索或任何第三方庫 - HashSet是罰款這樣的:

public final class IsoUtil { 
    private static final Set<String> ISO_LANGUAGES = new HashSet<String> 
     (Arrays.asList(Locale.getISOLanguages())); 
    private static final Set<String> ISO_COUNTRIES = new HashSet<String> 
     (Arrays.asList(Locale.getISOCountries())); 

    private IsoUtil() {} 

    public static boolean isValidISOLanguage(String s) { 
     return ISO_LANGUAGES.contains(s); 
    } 

    public static boolean isValidISOCountry(String s) { 
     return ISO_COUNTRIES.contains(s); 
    } 
} 

可能的檢查字符串長度第一,但我不知道我會打擾 - 至少不會,除非你想保護自己免受性能攻擊,你會得到巨大的字符串,這將需要很長時間來哈希。

編輯:如果你要使用第三方庫,ICU4J是最有可能的競爭者 - 但可能有更先進的最新列表比Locale支持的,所以你會想很可能要到處使用ICU4J。

+0

我通常更喜歡第三方庫(如Guava和ApacheCommons),因爲它們經常得到改進,而我無法連續檢查我的代碼:最好更改庫版本而不是讀取千代碼。不過,我真的很感謝你的回答。謝謝! – 2013-04-10 09:03:01

+0

@mat_boy:您會如何期待此代碼隨時間而改變?它已經委託給JDK來查找實際的國家和語言列表...... – 2013-04-10 09:04:18

+0

嗯,它不是關於這個代碼,它原則上是:)另外,如果我已經導入了一個庫,我通常更喜歡使用該庫中的方法使代碼更具可讀性。 – 2013-04-10 09:05:56