Вложенная структура 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);
}