我有两张地图:
Map<Date, List<Journey>> journeyMap = new TreeMap<Date, List<Journey>>
Map<Date, List<Job>> jobMap = new TreeMap<Date, List<Job>>
我使用了TreeMap,因为这意味着它们按日期排序,但我想同时浏览两个地图,获取Journey / Job的值,然后做一些工作。
我想我可以使用泛型,将作业/旅程存储为对象,然后检查instanceOf,但我不确定这是否是解决方案?
感谢。
答案 0 :(得分:0)
您假设这些地图的值按照相同的方式排序,但这绝对不正确。至少如果你想编写这样的逻辑,你需要声明相同的实现类作为引用:
TreeMap<Date, List<Journey>> journeyMap = new TreeMap<Date, List<Journey>>
TreeMap<Date, List<Job>> jobMap = new TreeMap<Date, List<Job>>
但请相信我你不想这样做。
你是对的!而是做2张地图创建1,持有一对Job / Journey对象 - 创建一个包含两个对象的JobJourneyHolder
类,这将是一个很好的解决方案。
答案 1 :(得分:0)
是的,为此定义一个新类肯定是解决方案,因为它将相关对象组合在一起,这在OOP中非常受欢迎。并且您不应该忘记实现hashCode()
和equals()
方法以使这些类在Java集合中正常工作:
public final class JourneyJob {
final Journey journey;
final Job job;
public JourneyJob(Journey journey, Job job) {
if (journey == null || job == null)
throw new NullPointerException();
this.journey = journey;
this.job = job;
}
public int hashCode() {
return Objects.hash(journey, job);
}
public boolean equals(JourneyJob other) {
return other.job.equals(job) && other.journey.equals(journey);
}
}
要将元素添加到公共地图:
Map<Date, List<JourneyJob>> map = new TreeMap<>();
...
if (map.contains(date)) {
map.get(date).add(new JourneyJob(journey, job));
} else {
map.put(date, new ArrayList<>(Arrays.asList(new JourneyJob(journey, job)));
}
...
要检索JourneyJob
个对象:
for (List<JourneyJob> jjList : map.values()) {
for (JourneyJob jj : jjList) {
journey = jj.journey;
job = jj.job;
//... do your work here
}
}
或者,如果您使用Java 8,可以使用嵌套的forEach()
:
map.values().stream().forEach(list ->
list.stream().forEach(jj -> {
Journey journey = jj.journey;
Job job = jj.job;
//... do your work here
})
);
答案 2 :(得分:0)
即使其他人是正确的,有更好,更安全,更舒适的方式来实现你想要的任何东西,也可以同时迭代两个地图(也就是收藏品)的条目。
//replace keySet() with your favorite method in for-each-loops
Iterator<Date> journeyIterator = journeyMap.keySet().iterator()
Iterator<Date> jobIterator = jobMap.keySet().iterator();
while(journeyIterator.hasNext() && jobIterator.hasNext()){
Date journeyDate = journeyIter.next()
Date jobDate = jobIterator.next();
//... do whatever you want with the data
}
这段代码明确地说明了for-each-loop对于一个Collection可以隐式执行的操作。它检索Iterator并从中获取Collection中的元素,就像读取文件一样。