我有一个HashMap元素的ArrayList,其格式为Category,Activity和Time。即。
{CATEGORY=Planning, ACTIVITY=Bills, TIME=5}
{CATEGORY=Planning, ACTIVITY=Bills, TIME=7}
{CATEGORY=Planning, ACTIVITY=Meetings, TIME=10}
{CATEGORY=Resources, ACTIVITY=Room1, TIME=15}
....
记下重复的CATEGORY / ACTIVITY对,因为列表中可能会发生
我需要能够将此List转换为多维列表。我能想到这个List需要看的方法的最好方法是编写一些伪代码...请在帖子底部看到。
我已经考虑了几种不同的方法来实现这一点但我坦率地对如何做到这一点感到困惑和沮丧。我已经考虑过在外部和内部循环中多次循环遍历ArrayList的低效方法,但我知道这不是一个好的编码实践。
有关如何实现此转换的任何建议,以便我可以像下面的伪代码一样循环?
For CATEGORY in CATEGORIES {
CategoryTime = 0
Display Category Header
For ACTIVITY in ACTIVITIES {
Activity Time = 0
For TIME_RECORD in ACTIVITY
Add time to activity total time, category total time & grand total
}
Display Activity Total
}
Display Category Total
}
Display Grand Total and rest of information...
修改的 我很感激为这个问题提供的所有反馈,看来真正最好的方法是增强一个HashMap元素的ArrayList所属的类。
我已经投票决定关闭这个问题,因为它过于本地化。如果你们其他一些开发人员也会效仿,我会很感激。我会删除它,但我现在不能,因为这个问题有答案。
答案 0 :(得分:3)
我会写一个看起来像这样的类:
public class Planner
{
Map<Category, Collection<Planner> details;
String activity;
long time;
}
public enum Category
{
PLANNING,RESOURCES,ETC;
}
然后你应该能够做到以下几点:
for(Category current: Planner.getDetails().keySet())
{
CategoryTime = 0
Display Category Header
Activity Time = 0
for(Planner currentPlanner : planner.getDetails().get(current))
{
currentPlanner.getActivity();
Activity Time += currentPlanner.getTime();
}
}
答案 1 :(得分:2)
除了糟糕的抽象之外,使用Collections API所遇到的问题是,您必须为给定的Activities
存储许多Category
。如果Category
是关键,那么您将被迫List<Activity>
作为Map
中的值。如果您查询给定的Category
,则表明您的工作尚未完成:您必须遍历List<Activity>
才能找到所需的工作。你怎么知道的?
这不是Map
;这是一张多地图。
我同意推荐课程的人。它要好得多,而不是那么多工作。更好的抽象和更多信息隐藏通常对您和您的客户更好。
public class Activity {
private Category category;
private Duration duration; // You want to encapsulate value and units together, right?
// I can see sequencing information that could be useful. Your whole Planner seems to be in need of work.
}
我认为你对时间单位的看法也很糟糕。我不知道TIME = 10是否意味着10小时,几天,几周,几个月,几十年 - 你得到了重点。单位很重要,特别是在这种情况下。您不希望人们将使用不同单位的时间加在一起。