例如,我有以下文件
B 01-02-2013 1233
B 03-02-2013 129
B 04-02-2013 13
日期从用户输入存储为String。下一个数字是“CaloriesBurnt”的整数
如果给出开始日期和结束日期,我想要。计算在这两个日期之间燃烧的总卡路里。所以例如在这里我想要总计从01-02-2013到04-02-2013的卡路里。所以我需要在那个时期之间拉出日期的卡路里。我知道我必须转换为日期格式,然后可能使用HASP MAP?订购??任何帮助真的很感激
答案 0 :(得分:4)
在这种情况下,最好的数据结构是TreeMap。它维护其键的排序,并且methods returning a "submap"包含两个键值之间的所有条目。
如果每个日期都是唯一的,您可以使用TreeMap<Date, Record>
。如果没有,那么使用TreeMap<Date, List<Record>>
(记录是用于保存文件一行所有元素的类)。
一旦你有了子图,你只需要迭代所有的值并加总他们的卡路里。
答案 1 :(得分:1)
您可能希望使用类似SortedMap<Date, UserData>
的排序集合(UserData
表示您要在地图中存储的任何数据),然后使用subMap(startDate, endDate + 1 day)
提取句点。请注意,由于上限是独占的,因此需要endDate + 1 day
。
示例:
SortedMap<Date, Integer> caloriesByDate = new TreeMap<>(); //we only store the calories
... //fill here
SimpleDateFormat f = new SimpleDateFormat("dd-MM-yyyy");
//get entries in the interval `[01-02-2013,03-02-2013]`.
caloriesByDate.subMap( f.parse("01-02-2013"), f.parse("04-02-2013") );
答案 2 :(得分:1)
首先,我将整个文本文件解析为对象。无论日期如何。文本文件中的每一行都可以是这样的(当然有setter和getter以及public / private和所有这些东西;):
class Entry {
Date date;
int calories;
}
解析文本文件并创建此类对象的列表。然后你可以在这个列表上操作。您可以对它进行排序(使用您编写的分拣机对象),您可以搜索它或执行您想要的任何操作。一旦你摆脱了实际的文本文件并且你有了对象,它就变得容易了。您甚至可以使用某些第三方库轻松计算统计数据(例如平均值,最大值或类似值)。