2016-02-22 2 views
4

У меня есть карта, хранящую данные временных рядов заработной платы человека в следующем форматеНайти изменение значения во временных рядах

HashMap<Date,Double> salaryHistory; 

Переменная salaryHistory может иметь данные 1AD к даже 2100AD.

Я использую subMap фильтровать данные из HashMap, но я столкнулся с проблемой в следующем сценарии

Рассмотрим зарплату человека, как этот

Jan-01-1969, 100 
Jan-01-1979, 200 

Когда пользователь запрашивает зарплату между С 1 января по 1 января 1970 года по 1 января 1972 года, subMap возвращает «нуль», но на самом деле он должен вернуть 100, потому что в 1969 году зарплата человека составляла 100, и она никогда не менялась до 1979 года.

Есть ли простой способ сделать это? Как библиотека.

Пожалуйста, предоставьте ваши ценные предложения

+1

Не могла ли ваша логика просто проверить, существует ли заданная дата между двумя клавишами и обеспечить нижнее из двух значений? – bphilipnyc

ответ

1

Я нашел, если вы используете SortedMap, вместо HashMap, вы получите поведение вы ожидаете:

Date j1969 = DateTimeUtils.convertStringToDate("1969-01-01"); 
    Date j1974 = DateTimeUtils.convertStringToDate("1974-01-01"); 
    Date j1979 = DateTimeUtils.convertStringToDate("1979-01-01"); 
    Date j1989 = DateTimeUtils.convertStringToDate("1989-01-01"); 

    TreeMap<Date, Double> treemap = new TreeMap<Date, Double>(); 
    SortedMap<Date, Double> treemapincl = new TreeMap<Date, Double>(); 

    // populating tree map 
    treemap.put(j1969, 100.0); 
    treemap.put(j1979, 200.0); 
    treemap.put(j1989, 300.0); 

    treemapincl=treemap.subMap(j1969,j1974); 
    System.out.println("Sub map values: "+treemapincl); 

Выход:

Sub map values: {Wed Jan 01 00:00:00 GMT-05:00 1969=100.0} 
0

Если вам необязательно использовать HashMap, вместо этого замените его на TreeMap. Затем вы можете использовать TreeMap.floorEntry() для получения соответствующего Entry.

Смежные вопросы