Insensetive thread safe Map не работает должным образом - PullRequest
0 голосов
/ 22 марта 2020

У меня есть ConcurrentSkipListMap с нечувствительным ключом:

public static ConcurrentMap<String, GooglePlayGame> games = new ConcurrentSkipListMap<String, GooglePlayGame>(String.CASE_INSENSITIVE_ORDER);

Если я запускаю свое приложение в первый раз и добавляю к запросу пользователя карты, например, я выполнил --games.put ("Oddmar", .. .) -, если пользователь после этого запросит - / game oddmar (odDmar или что-то еще) - это будет работать, но .. Я всегда загружаю свою карту из файла json при запуске в блок * stati c:

static {
        TypeFactory typeFactory = mapper.getTypeFactory();
        MapType mapType = typeFactory.constructMapType(ConcurrentSkipListMap.class, String.class, GooglePlayGame.class);
        try {
            games = mapper.readValue(new File(
                    "gpgames_library.json"), mapType);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

Если после «перезапуска» пользователь попробует / game oddmar, он не будет работать - только / game Oddmar. Но почему? Если в приложении я всегда читаю карту из моей переменной (не из файла).

1 Ответ

1 голос
/ 22 марта 2020

Когда ваша "TypeFactory" создает карту, она не использует CASE_INSENSITIVE_ORDER, а естественный порядок. Я не знаю, какова ваша «TypeFactory», но один из способов обойти проблему состоит в том, чтобы прочитать JSON во временное значение, а затем с помощью putAll добавить то, что было прочитано из файла JSON, в ваш * 1003. * карта.

Map<String, GooglePlayGame> temporary = mapper.readValue(new File(
          "gpgames_library.json"), mapType);
games.putAll(temporary);
...