我目前正在通过大学学习集合和地图(仍在使用Java 7)。
他们给了我们一个半完成的待办事项列表应用程序来完成。目前,待办事项列表采用三个String局部变量来允许用户声明作业(aJob),执行它的时间(aTime)和执行它的日期(aDate)。
该应用程序还有一个实例变量(今天),它保存今天的日期。
我需要想出一种方法来检查HashMap是否存在今天到期的任何任务。所以我需要能够只查询aDate局部变量所归属的HashMap值。
我知道迭代地图,我可以将键或值放入一个集合,然后迭代集合 - 不是问题。但是如果我使用values()方法(在Map类中)将它们放入一个集合中 - 它将每个键的所有三个字符串放入集合中。我只想将aDate值移动到一个集合中。
有什么想法吗?
我似乎只能找到地图只有一个Key和Single Value的示例。此列表具有单个键和每个键三个值。
任何指针都会好吗?
亲切的问候
编辑.....
以为我会添加一些代码来帮助,因为有几种不同的方法 - 我非常感谢。但不确定它们是否符合我的需求......
Job Class是这样构建的......
public Job(String aJob, String aDate, String aTime)
{
Job = aJob;
date = aDate;
time = aTime;
}
然后我在待办事项列表类的实例声明中创建地图....
Map<Integer, Job> toDoList = new HashMap<>();
所以我需要知道迭代这个地图的最佳方法,但是只有Job属性'aDate'可能会保留我之后的值。
不确定这是否有帮助?
亲切的问候
答案 0 :(得分:1)
如果真的唯一允许使用的结构是一个Map,其中每个键有3个值(如果我理解的话就是这种情况),其中只有一个是Date,你在技术上可以做到以下几点:
map.values()
.stream()
.filter(Date.class::isInstance)
...whatever else you want to do
其他建议的解决方案虽然设计明智得多。
答案 1 :(得分:0)
只需创建一个包含所需数据的类。例如。
如果你需要像Map<String, Tuple<String, Integer, Date>>
那样奇怪的东西,只需创建一个包含元组的新类:
class TupleHolder {
private String firstValue;
private Integer secondValue;
private Date thirdValue;
// get/set here...
}
并使用它:Map<String, TupleHolder>
答案 2 :(得分:0)
如果你不能像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>
交换。