[英]Iterate over a HashMap with multiple values per key
我目前正在大学中学习设置和地图(仍然使用Java 7)。
他们给了我们一半完成的待办事项清单应用程序。 当前,待办事项列表使用三个String局部变量来允许用户声明作业(aJob),执行该作业的时间(aTime)和执行该作业的日期(aDate)。
该应用程序还具有一个实例变量(今天),该变量保存今天的日期。
我需要想出一种方法来检查HashMap是否有今天到期的任何任务。 因此,我需要能够仅查询aDate局部变量赋予的HashMap值。
我知道,要迭代Maps,可以将键或值放入Set中,然后在Set上进行迭代-没问题。 但是,如果我使用values()方法(在Map类中)将它们放入集合中,则它将每个键将所有三个String放入集合中。 我只想将aDate值移动到集合中。
有任何想法吗?
我似乎只能找到Maps只有一个键和一个值的示例。 该列表有一个键,每个键三个值。
任何指针都会很好吗?
亲切的问候
编辑.....
只是想我会添加一些代码来提供帮助,因为有几种不同的方法-我都非常满意。 但是不确定它们是否满足我的需求。
作业类就是这样构造的...
public Job(String aJob, String aDate, String aTime)
{
Job = aJob;
date = aDate;
time = aTime;
}
然后,在待办事项列表类的实例声明中创建地图。
Map<Integer, Job> toDoList = new HashMap<>();
因此,我需要知道遍历此映射的最佳方法,但是可能只有Job属性'aDate'可以保存我想要的值。
不确定是否有帮助?
亲切的问候
如果确实允许您使用的唯一结构是Map,其中每个键都有3个值(如果我正确理解的话就是这种情况),其中只有一个是Date,从技术上讲,您可以执行以下操作:
map.values()
.stream()
.filter(Date.class::isInstance)
...whatever else you want to do
从设计角度来看,其他建议的解决方案要好得多。
只需创建一个包含所需所有数据的类。 例如,如果您需要诸如Map<String, Tuple<String, Integer, Date>>
类的奇怪东西Map<String, Tuple<String, Integer, Date>>
只需创建一个包含Tuple的新类:
class TupleHolder {
private String firstValue;
private Integer secondValue;
private Date thirdValue;
// get/set here...
}
并使用它: Map<String, TupleHolder>
如果您不能使用Toisen建议的自定义类,则HashMap<String, HashMap<String, ArrayList<String>>>
可能为您解决了问题。
我添加了一个使用方法的示例(以及一些随机数据的填充)
public class FunkyMap {
private HashMap<String, HashMap<String, ArrayList<String>>> jobs;
// For random data
private String[] job = {"EAT", "SLEEP", "FART", "RELAX", "WORK"};
private String[] time = {"MORNING", "BEFORENOON", "NOON", "AFTERNOON", "EVENING", "MIDNIGHT"};
private String[] date = {"FIRST", "SECOND", "THIRD", "FOURTH"};
public FunkyMap() {
jobs = new HashMap<>();
// To populate some random data
Random r = new Random();
for(int i = 0; i < 20; i++) {
String d = date[r.nextInt(date.length)];
if(jobs.containsKey(d)) {
HashMap<String, ArrayList<String>> inner = jobs.get(d);
String t = time[r.nextInt(time.length)];
if(inner.containsKey(t)) {
inner.get(t).add(job[r.nextInt(job.length)]);
} else {
List<String> s = Arrays.asList(new String(job[r.nextInt(job.length)]));
inner.put(t, new ArrayList<String>(s));
}
} else {
jobs.put(d, new HashMap<String, ArrayList<String>>());
}
}
// Actual iteration over date => time => jobs
Iterator<String> i = jobs.keySet().iterator();
while(i.hasNext()) {
String iKey = i.next();
HashMap<String, ArrayList<String>> inner = jobs.get(iKey);
System.out.println("Jobs scheduled for " + iKey);
Iterator<String> j = inner.keySet().iterator();
while(j.hasNext()) {
String jKey = j.next();
ArrayList<String> actualJobs = inner.get(jKey);
System.out.println("\tAt " + jKey);
for(String s : actualJobs) {
System.out.println("\t\tDo " + s);
}
}
}
}
public static void main(String[] args) {
new FunkyMap();
}
}
我自由地假设日期是唯一的,而每个日期的时间是唯一的,而时间可以容纳任何数量的工作,包括重复的工作。 如果对作业的最后一个假设不正确,则可以将ArrayList<String>
与Set<String>
交换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.