Одна Map потеряет повторяющиеся ключи и не восстановит исходную строку. Сохраните исходное представление отдельно, а для getValue постройте индекс с явно выбранным последним значением ключа.
Преобразование строки в набор пар ключ‑значение
Одна Map потеряет повторяющиеся ключи и не восстановит исходную строку. Сохраните исходное представление отдельно, а для getValue постройте индекс с явно выбранным последним значением ключа.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дана строка, в которой несколько пар «ключ=значение» разделены символом ;. Необходимо реализовать класс ParseHolder, обеспечивающий:
void parse(String str)— разбор входного текста и заполнение внутренней структуры данных.String getValue(String key)— мгновенный (O(1)) доступ к значению по указанному ключу.String generateRecord()— формирование исходной строки из сохранённых пар.
Пример строки:
key1=val1;key1=abc;key2=val2;key3=val3;key1=val4;key2=val5;key1=val6
public class ParseHolder {
void parse(String str) {
// ...
}
String generateRecord() {
return null;
}
public String getValue(String key) {
return null;
}
public static void main(String[] args) throws Exception {
String testString = "key1=val1;key1=abc;key2=val2;key3=val3;" +
"key1=val4;key2=val5;key1=val6";
ParseHolder parser = new ParseHolder();
parser.parse(testString);
System.out.println(parser.generateRecord());
}
}
Ответ
Одна Map потеряет повторяющиеся ключи и не восстановит исходную строку. Сохраните исходное представление отдельно, а для getValue постройте индекс с явно выбранным последним значением ключа.
public class ParseHolder {
private String original = "";
private java.util.Map<String, String> values = new java.util.HashMap<>();
void parse(String str) {
java.util.Objects.requireNonNull(str);
var parsed = new java.util.HashMap<String, String>();
if (!str.isEmpty()) for (String pair : str.split(";", -1)) {
int equals = pair.indexOf('=');
if (equals <= 0) throw new IllegalArgumentException("Invalid pair");
parsed.put(pair.substring(0, equals), pair.substring(equals + 1));
}
original = str;
values = parsed;
}
public String getValue(String key) { return values.get(key); }
String generateRecord() { return original; }
}
Последнее key1 равно val6. Разбор публикуется только после полной проверки. Lookup — ожидаемое O(1), не строгая гарантия худшего случая. Пустые значения допустимы, пустые ключи и завершающий ; запрещены; экранирование разделителей не задано.