Более чистый способ проверить, является ли строка 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()
выделений.