Комбинируя элементы из нескольких других ответов, вы можете сохранить SortedMap
от кодов стран до названий стран, отсортированных по убыванию длины (со связями, прерванными по алфавиту).
Таким образом, самое длинное совпадение всегда проверяется первым, поэтому вы не столкнетесь с той же проблемой префикса.
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import static java.util.Map.Entry;
import static java.util.Comparator.comparingInt;
import static java.util.Comparator.naturalOrder;
class Example {
public static void main(String[] args) {
SortedMap<String, String> codeCountries = new TreeMap<>(
comparingInt(String::length)
.reversed()
.thenComparing(naturalOrder()));
codeCountries.putAll(Map.of(
"1", "United States",
"1241", "Bahamas",
));
for (String name : codeCountries.values) {
System.out.println(name);
// Prints "United States", then "Bahamas"
}
}
}
Единственное другое изменение, которое вам понадобится, это то, что вам придется удалитьштрихи из кодов стран перед , помещающие их в карту.Если вы этого не сделаете, оба ключа останутся на карте.
В качестве аналогичной, потенциально более быстрой (но не настолько быстрой, чтобы это действительно имело бы значение) альтернативы, вы можете сохранить несортированную карту с помощьюкоды стран в качестве ключей, и всякий раз, когда вы получаете ввод, вы можете попытаться получить все его префиксы с карты:
Map<String, String> countryCodes = Map.of("1242", "Bahamas", "1", "United States");
String input = /* get some input */;
for (int i = input.length; i > 0; --i) {
String country = countryCodes.get(input.substring(0, i));
if (country != null) {
return country;
}
}
// If you get here, no country code was found in the map.
// Alternatively, with streams:
IntStream.range(0, input.length())
.mapToObj(i -> input.substring(0, input.length() - i))
.filter(countryCodes::containsKey)
.findFirst();
Однако, это более надежная идея, чем беспокоиться о разборе кодов стран или обнаружении совпадений междуони (особенно если ваши пользователи иногда забывают включить код своей страны) должны сначала запросить код страны, а затем остальную часть номера.Тогда вы можете просто посмотреть код страны, не беспокоясь о совпадениях.