2013-04-10 18 views
5

Stringの2文字を使用すると、ISO 639の国または言語名を表す必要があります。文字列がJavaでISO言語の国であるかどうかを確認する方法

あなたが知っている、Localeクラスは、それぞれ、すべてのISO言語とISOの国でStringの配列を返す二つの機能getISOLanguagesgetISOCountriesを持っています。

特定の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

+0

もちろん...ありがとうございます! –

+0

@Dariusz:少なくともハッシュルックアップを行っている場合、私は気にしません。ハッシュするのに長い時間がかかる膨大な文字列を受け取ることが予想されない限り、それは証明されていないとかなり複雑です。 –

答えて

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

あなたは可能性のためにチェック最初は文字列の長さですが、ハッシュするのに長い時間がかかる膨大な文字列を与えられた場合のパフォーマンス攻撃に対して自分自身を保護しない限り、少なくとも私は気にしません。

EDIT:あなたはは、サードパーティのライブラリを使用したくないICU4Jが最も可能性の高い候補である場合 - それがうまくLocaleでサポートされているものより最新のリストを有することができるので、あなたが欲しいですおそらくどこでもICU4Jを使用するように移動します。

+0

私は通常、コードを連続してチェックすることはできませんが、頻繁に改良されているため、サードパーティ製のライブラリ(GuavaやApacheCommonsなど)を使用することをお勧めします。しかし、本当にあなたの答えに感謝します。ありがとうございました! –

+0

@mat_boy:このコードが時間とともにどのように変化すると思いますか?既に国や言語のリストを見つけるためにJDKに委任しています... –

+0

これは基本的にこのコードに関するものではありません:)さらに、私はすでにライブラリのインポートを行ったそのライブラリのメソッドを使用してコードを読みやすくします。 –

関連する問題