Ваше решение действительно несколько неэффективно.
Человек, который дал вам строку для разбора, также является клоуном. Существуют отраслевые стандартные форматы сериализации, такие как JSON или XML, для которых существуют быстрые, эффективные анализы. Изобретение квадратного колеса никогда не является хорошей идеей.
Первый вопрос: вам все равно? Достаточно ли достаточно, чтобы это мешало производительности вашего приложения? Скорее всего, это не так, но есть только один способ узнать. Контролируйте свой код.
Тем не менее, существуют более эффективные решения. Ниже приведен пример
public static void main (String[] args) throws java.lang.Exception
{
String test = "pet:cat::car:honda::location:Japan::food:sushi";
boolean stateiskey = true;
Map<String, String> map = new HashMap<>();
int keystart = 0;
int keyend = 0;
int valuestart = 0;
int valueend = 0;
for(int i = 0; i < test.length(); i++){
char nextchar = test.charAt(i);
if (stateiskey) {
if (nextchar == ':') {
keyend = i;
stateiskey = false;
valuestart = i + 1;
}
} else {
if (i == test.length() - 1 || (nextchar == ':' && test.charAt(i + 1) == ':')) {
valueend = i;
if (i + 1 == test.length()) valueend += 1; //compensate one for the end of the string
String key = test.substring(keystart, keyend);
String value = test.substring(valuestart, valueend);
keystart = i + 2;
map.put(key, value);
i++;
stateiskey = true;
}
}
}
System.out.println(map);
}
Это решение является конечным автоматом с двумя состояниями. Он просматривает каждый символ только дважды, один раз, когда он проверяет его на границе, и один раз, когда он копирует его в новую строку на вашей карте. Это минимальная сумма.
Он не создает объекты, которые не нужны, например, строкоструйные машины, струны или массивы, что обеспечивает низкое давление в коллекции.
В нем есть хорошая местность. Следующий символ, вероятно, всегда находится в кеше, поэтому поиск дешевый.
Это происходит в глубокой стоимости, которая, вероятно, не стоит, хотя:
- Это гораздо более сложным и менее очевидным
- Есть все виды движущихся частей
- Это сложнее для отладки, когда ваш строка в неожиданном формате
- Ваши сотрудники будут ненавидеть вас
- вы будете ненавидеть вас, когда вы должны что-то отлаживать
Стоит ли это? Может быть. Насколько быстро вам нужна эта строка, которая точно анализируется?
Быстрый и грязный бенчмарк в https://ideone.com/8T7twy говорит мне, что для этой строки этот метод примерно в 4 раза быстрее. Для более длинных строк разница, вероятно, несколько больше.
Но ваша версия все еще только 415 миллисекунд для 100 000 повторений, где эта составляет 99 миллисекунд.
Не могли бы вы объяснить, почему вы думаете, что это не эффективно? Кстати, это не codereview.stackexchange.com, вы должны попробовать его там. – Tom
Прежде всего, я новичок в Java и всегда думал, что есть более простой способ делать то, что я делаю. Далее я использовал 2 объекта массива String и дважды назвал функцию split. Также я использую t [0] и t [1], которые могут вызывать исключение ArrayIndexOutOfBounds, если нет значений. – v1shnu
Этот метод абсолютно прекрасен. –