Преобразование строки в набор пар ключ‑значение

Одна Map потеряет повторяющиеся ключи и не восстановит исходную строку. Сохраните исходное представление отдельно, а для getValue постройте индекс с явно выбранным последним значением ключа.

Короткий ответ

Что ответить на собеседовании

Одна Map потеряет повторяющиеся ключи и не восстановит исходную строку. Сохраните исходное представление отдельно, а для getValue постройте индекс с явно выбранным последним значением ключа.

Подробный разбор

Ответ с пояснениями

Условие

Дана строка, в которой несколько пар «ключ=значение» разделены символом ;. Необходимо реализовать класс ParseHolder, обеспечивающий:

  1. void parse(String str) — разбор входного текста и заполнение внутренней структуры данных.
  2. String getValue(String key) — мгновенный (O(1)) доступ к значению по указанному ключу.
  3. 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), не строгая гарантия худшего случая. Пустые значения допустимы, пустые ключи и завершающий ; запрещены; экранирование разделителей не задано.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее