Вы используете .contains()
. Вы должны использовать .startsWith()
. Это намного быстрее.
Затем в вашем else if
вы проверяете то, что вы уже проверяли в if
.
Это только один подход о том, как улучшить алгоритм:
Сортировка префиксов:
+ 43211 +4321 +4452 +4 + 7700
Что в этом хорошего? Ну, сначала он всегда найдет самый длинный префикс. Вы можете выйти из l oop и вам не нужно искать более длинные префиксы.
Arrays.sort(prefixes, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.startsWith(o2) ? 1 : o1.compareTo(o2);
}
});
Map<String, String> numsAndPrefixes = new HashMap<>();
for (String number: numbers) {
numsAndPrefixes.put(number, "");
for (String prefix: prefixes) {
if (number.startsWith(prefix, 1)) {
numsAndPrefixes.put(number, prefix);
break;
}
}
}
Но если ваш номер начинается с +1 и префикса нет, он продолжит проверять все префиксы с помощью +2 +3 +4
... которые явно не совпадают. (Выпуск 1)
Также, если ваш номер начинается с +9
, префикс будет найден очень поздно. (Выпуск 2)
Как это исправить? Ну, вы можете сохранить индексы, где начинается +1, начинается +2, ...:
В нашем списке префиксов:
0 1 2 3 4 5 (index)
+1233 +123 +2233 +2 +3 +4
+ 2 начинается с индекса [2] и +3 начинается с индекса [4]. Поэтому, когда вы хотите узнать префикс для номера, начинающегося с +2, вам нужно только проверить элементы [2] и [3]. Это устранит проблемы 1 и 2.
Можно также сохранить индексы для большего количества цифр (например, где начинается +13).