如何循环通过List <Pair >>迭代器

时间:2019-07-29 09:13:10

标签: java loops iterator

我有一个遍历包含<Key, <List<Pair>>的映射的方法。我将如何遍历并获得所有结果?由于此列表包含多种货币。我不希望将不同类型的货币金额加在一起。我的尝试在下面,似乎并没有收集所有结果

2 个答案:

答案 0 :(得分:0)

Map<Date, List<Pair<BigDecimal, Currency>>> map = ...
map.forEach((date, list) -> {
    list.forEach(pair -> {
        // business logic here
    });
});

这将遍历地图,并依次遍历每个列表。尚不清楚您要实现什么目标,但是希望这将为您指明正确的方向。

编辑(不使用Java 8)

for (Map.Entry<Date, List<Pair<BigDecimal, Currency>>> entry : map.entrySet()) {
    Date date = entry.getKey();
    List<Pair<BigDecimal, Currency>> list = entry.getValue();
    for (Pair<BigDecimal, Currency> pair : list) {
        BigDecimal bd = pair.getKey();
        Currency currency = pair.getValue();
        //business logic here
    }
}

它不太优雅(我想这是升级到Java 8的原因),但是在功能上与第一个解决方案等效(范围/变量名称略有不同)。 for (T t : Iterable<T>)语法是在Java 5中通过Iterable接口引入的,因此它实际上适用于所有人。

编辑(如果专门使用Iterator

while (source.hasNext()) {
    Map.Entry<Date, List<Pair<BigDecimal, Currency>>> entry = source.next();
    Date date = entry.getKey();
    List<Pair<BigDecimal, Currency>> list = entry.getValue();
    for (Pair<BigDecimal, Currency> pair : list) {
        BigDecimal bd = pair.getKey();
        Currency currency = pair.getValue();
        //business logic here
    }
}

答案 1 :(得分:0)

假设您有一个包含所有数据的地图,则可以执行以下操作:

Iterator<Entry<Date, List<Pair<BigDecimal, Currency>>>> itr = source.entrySet().iterator();

现在有了此迭代器,您可以将其转换为Element迭代器:

Iterator<Element> eItr = new Iterator<Element> {
    int index = 0;
    Iterator<Entry<Date, List<Pair<BigDecimal, Currency>>>> itr = source.entrySet().iterator();
    Entry<Date, List<Pair<BigDecimal, Currency>>> current = itr.hasNext()? itr.next() : null;

    @Override
    public boolean hasNext() {
        return current != null;
    }

    @Override
    public Element next() {
        try {
            return new Element(current.getKey(), current.getValue().get(index).getFirst(), current.getValue().get(index).getSeccond());
        } finally {
            index++;
            if (index >= current.getValue().size()) {
                index = 0;
                current = itr.hasNext()? itr.next() : null;
            }
        }
    }
}