当前位置: 首页 > 面试题库 >

同时提供两个列表内容的迭代器?

郎成龙
2023-03-14
问题内容

假设我有这个:

public class Unit<MobileSuit, Pilot> {

    ...

    List<MobileSuit> mobileSuits;
    List<Pilot> pilots;

    ...
}

我想以该类之外最简单的方式遍历每个对象。我应该怎么做呢?我考虑过这样做:

public class Unit<MobileSuit, Pilot> {

    ...
    Iterator<MobileSuit> iteratinMechas;
    Iterator<Pilot> iteratinPeople;

    class IteratorCustom<MobileSuit, Pilot> implements Iterator {

        public boolean hasNext() {
            return iteratinMechas.hasNext() && iteratinPeople.hasNext();
        }

        public void remove() {
            iteratinMechas.remove();
            iteratinPeople.remove();
        }

        public Object next() {
            // /!\
        }

    }

    public Iterator iterator() {
        return new IteratorCustom<MobileSuit, Pilot>(mobileSuits, pilots);
    }
}

遵循这些原则。

无论如何,问题是我不能真正从next()返回单个对象,并且我也不能让Iterator接受多个类型。那么,有什么想法吗?

另外,我不能开设新课程来将MobileSuit和Pilot相结合。我需要将它们分开,即使我一次遍历两者。原因是可能有没有飞行员的机动战士,而且我不确定如何通过将他们保持在同一个班级来解决这个问题。此类需要在其他地方进行处理,因此我不得不统一围绕该界面和许多其他内容的接口。基本上,假设需要将MobileSuit和Pilot分开。


问题答案:

无论如何,问题是我不能真正从next()返回单个对象,并且我也不能让Iterator接受多个类型。那么,有什么想法吗?

显然,您将需要一个轻量级的“ pair”类。这大致类似于Map.Entry内部类。

这是通用解决方案的粗略介绍:

public class ParallelIterator <T1, T2> implements Iterator<Pair<T1, T2>> {

    public class Pair<TT1, TT2> {
        private final TT1 v1;
        private final TT2 v2;
        private Pair(TT1 v1, TT2 v2) { this.v1 = v1; this.v2 = v2; }
        ...
    }

    private final Iterator<T1> it1;
    private final Iterator<T2> it2;

    public ParallelIterator(Iterator<T1> it1, Iterator<T2> it2) { 
        this.it1 = it1; this.it2 = it2;
    }

    public boolean hasNext() { return it1.hasNext() && it2.hasNext(); }

    public Pair<T1, T2> next() {
        return new Pair<T1, T2>(it1.next(), it2.next());
    }

    ...

}

注意:这并未明确处理列表长度不同的情况。将会发生的是,较长列表末尾的多余元素将被静默忽略。



 类似资料:
  • 问题 你想同时迭代多个序列,每次分别从一个序列中取一个元素。 解决方案 为了同时迭代多个序列,使用 zip() 函数。比如: >>> xpts = [1, 5, 4, 2, 10, 7] >>> ypts = [101, 78, 37, 15, 62, 99] >>> for x, y in zip(xpts, ypts): ... print(x,y) ... 1 101 5 78 4

  • 我有两份清单: 列表1: Object1(name1, id1) 列表2: Object2(name2, id2) 给定list1的大小与list2相同 我想迭代list2,如果list2的name2不为null,则更新list1的name1。 以下是使用旧java的代码: 用java实现这一点的最佳方法是什么。util。流动

  • 问题内容: 我有一个像(669256.02,6117662.09,669258.61,6117664.39,669258.05,6117665.08)的集合需要迭代 将打印 我在Python 3.3 btw上 问题答案: 您可以使用迭代器:

  • 问题内容: 我知道您不应在遍历列表时添加/删除项目。但是,如果不更改列表长度,是否可以修改要迭代的列表中的项目? 还是应该迭代列表索引?像那样: 问题是:以上两种方式都是允许的,还是只有第二种是没有错误的? 如果答案是肯定的,以下代码段是否有效? UPD。我想在python文档中看到“允许这些操作”而不是某人的假设。 问题答案: 可以这么说,您 不是在 修改列表。您只是在修改列表中的元素。我不认为

  • 我有两个长度不同的< code>Vec,例如: 我想成对迭代它们,打印: 我可以使用< code>Iterator::zip来获得在< code>xs和< code>ys中具有匹配元素的对: 但是对于“不匹配”位,我需要复杂的代码来检查长度并从其余部分中提取一部分。 我想要一个完全基于迭代器的解决方案,所以我尝试了: 这是不正确的,因为第一个循环跳过了在另一个列表中没有匹配的第一个元素(x=4)。

  • 我有一个Firebase数据库,在一个特定的节点级别上有日期,每个日期都有键值对,其值为一定的数字。现在我需要找到最近两天常见的数字。