在Java中同时迭代两个TreeMap

时间:2015-04-16 11:52:51

标签: java loops treemap

我有两张地图:

 Map<Date, List<Journey>> journeyMap = new TreeMap<Date, List<Journey>>
 Map<Date, List<Job>> jobMap = new TreeMap<Date, List<Job>>

我使用了TreeMap,因为这意味着它们按日期排序,但我想同时浏览两个地图,获取Journey / Job的值,然后做一些工作。

我想我可以使用泛型,将作业/旅程存储为对象,然后检查instanceOf,但我不确定这是否是解决方案?

感谢。

3 个答案:

答案 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中的元素,就像读取文件一样。