Вложенная структура HashMap

Я новичок в Java. Я ищу, чтобы сделать структуру данных для быстрого поиска. Мои столбцы:

  • Дата
  • Дата истечения (есть несколько дат истечения для каждой даты)
  • Вариант выбора (Call / Put)
  • Strike Price (для каждой даты есть несколько страйковых цен)
  • Цена закрытия

Так что в основном мой пользователь выберет дату, опцию (Call/Put), цену исполнения, дату истечения.
Мне нужно вернуть цену закрытия. Я решил сделать вложенные HashMaps. Первый - это Option Type с Keys- Call и Put и значением как другой HashMap ExpiryDate, который указывает на Strike, который снова указывает на Date, который, наконец, указывает на цену закрытия.

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

LinkedHashMap<String,LinkedHashMap<String, LinkedHashMap<Double, LinkedHashMap<String, Double>>>> Option= new LinkedHashMap<String, LinkedHashMap<String, LinkedHashMap<Double,LinkedHashMap<String,Double>>>>();
LinkedHashMap<String, LinkedHashMap<Double, LinkedHashMap<String, Double>>> Expiry= new LinkedHashMap<String, LinkedHashMap<Double,LinkedHashMap<String,Double>>>();
LinkedHashMap<Double, LinkedHashMap<String, Double>> Strike= new LinkedHashMap<Double, LinkedHashMap<String, Double>>();
LinkedHashMap<String, Double> Date= new LinkedHashMap<String, Double>();

 for(i=0;i<70000;i++){
            Option.put(Option1[i], Expiry);
            Expiry.put(ExpiryDate1[i], Strike);
            Strike.put(Strike1[i], Date);
            Date.put(CurrentDate1[i], CPrice[i]);

        }

Option1, ExpiryDate1, Strike1, CurrentDate1 - все массивы, которые извлекают данные из моего листа Excel. Но, очевидно, я не могу искать в массиве, так как это слишком много времени. Итак, я решил пойти на HashMaps. И мой цикл для заполнения данных. Я предполагаю, что HashMaps хранит только уникальные данные. Таким образом, это должно хранить каждую возможную комбинацию. Но мои цены закрытия перезаписываются! Простите за глупые ошибки, если таковые имеются. Я только начал с программирования для построения стратегий фондового рынка! Спасибо!

2 ответа

Что вам нужно сделать, это собрать все ваши данные в одном контейнере и проиндексировать их с разными индексами. Для этого вы можете создать класс Stock с атрибутом option, expiryDate, strike, date и cPrice. Код прост, но спросите, если у вас есть какие-либо вопросы. Также конструктор для Stock, который принимает все данные в качестве параметров и устанавливает поля.

После этого вы можете сделать что-то вроде этого:

for(i=0;i<70000;i++){
    stock = new Stock(Option1[i], ExpiryDate1[i], Strike1[i], CurrentDate1[i], CPrice[i])
    optionMap.put(stock.getOption(), stock);
    expiryMap.put(stock.getExpiryDate(), stock);
    strikeMap.put(stock.getStrike(), stock);
    dateMap.put(stock.getDate(), stock);
    cPriceMap.put(stock.getCPrice(), stock);
}

Этот код для каждой акции создает ОДИН экземпляр класса Stockи добавляет ССЫЛКИ (не клоны объекта, не лишнюю память) в различные HashMaps. Каждая из карт внутри for это экземпляр HashMap с правильными обобщениями. Опять легкий код, спросите, если что-то неясно.

При этом у вас в основном есть 5 индексов, каждый из которых состоит из пары (ключ, ссылка), только дублирующие (квинтиплицирующие?) Ссылки на экземпляр Stock а не сами объекты. Это означает, что вы не используете память в пять раз больше, и вы можете искать акции на любой из карт (в соответствии с ключом, который вы хотите искать), изменять что-либо из объекта (сохранить, удаляя его), и изменения будут отражается на всех картах.

Что касается проблемы, с которой вы столкнулись при решении: "Предположим, у меня есть 10 страйк-цен от 3000-4000 в день. Цена для каждой страйк-цены каждый день будет отличаться". Вы можете искать на strikeMap используя удар в качестве ключа. Я верю, что это решит вашу проблему, но дайте мне знать, если это не так

----- НИЖЕ ОРИГИНАЛЬНЫЙ (неправильный) ОТВЕТ, ОСТАВЛЯЯ ЕГО ТОЛЬКО В СЛУЧАЕ -----

Вероятно, вы вставляете в несколько карт ссылки на один и тот же объект. Если это так, то изменение, сделанное в одной ссылке, изменит объект ClosingPrice, на который указывает другая (не связанная) ссылка на другой карте. Естественно, если вы попытаетесь получить ссылку на вторую карту, объект изменится, потому что это в основном тот же объект (хотя он указан разными ссылками), который вы вставляете в две карты, которые вы хотите изменить независимо.

Если вы обнаружите, что проблема в том, как я пытался угадать выше, решение простое: убедитесь, что каждая ссылка, которую вы вставляете в карту и хотите изменить независимо, на самом деле является другим объектом.

Если бы вы могли опубликовать некоторый код, вам было бы намного легче помочь.

Проверьте, создаете ли вы новый экземпляр хэш-карты. Некоторые из подводных камней используют один и тот же экземпляр hashmap для заполнения разных записей.

Например, это пример неправильного кода

Проверьте свой код, если у вас есть какие-либо несоответствия, такие как приведенный ниже фрагмент кода.

Map<Date,Map<String,Date>> testMap = new HashMap<Date,Map<String,Date>>
Map<String,Date> testMap2 = new HashMap<String,Date>();
for(int i = 1; i < 10 ; i++) {
    for(int j = 1; j < 10 ; j++) {
       testMap2.put(String.valueOf(j), new Date());
    }
    testMap.put(new Date(), testMap2);
}
Другие вопросы по тегам