Более чистый способ проверить, является ли строка ISO страной ISO на Java

Предположим, что есть два символа String, которые должны представлять название страны или языка ISO 639.

Знаете, Locale класс имеет две функции getISOLanguages и getISOCountries, которые возвращают массив String со всеми языками ISO и странами ISO соответственно.

Чтобы проверить, является ли конкретный объект String допустимым языком ISO или страной ISO, я должен заглянуть внутрь этого массива для соответствия String. Хорошо, я могу это сделать, используя двоичный поиск (например, Arrays.binarySearch или ApacheCommons ArrayUtils.contains).

Вопрос: существует любая утилита (например, из библиотек Guava или Apache Commons) , которая обеспечивает более чистый способ, например. функция, которая возвращает boolean для проверки a String как допустимого языка ISO 639 или ISO 639 Country?

Например:

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

Ответ 1

Я бы не стал использовать бинарный поиск или любые сторонние библиотеки - 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 повсюду.

Ответ 2

Насколько я знаю, такого метода нет ни в одной библиотеке, но, по крайней мере, вы можете объявить его так:

private boolean isValidCountryCode(String countryCode) {
   return binarySearch(Locale.getISOCountries(), countryCode) >= 0;
}

Locale.getISOCountries() всегда будет создавать новый массив, чтобы вы могли хранить в нем статическое информационное поле, чтобы избежать Locale.getISOCountries() выделений.