【问题标题】:Java: Best/elegant way to iterate over 2 listsJava:迭代 2 个列表的最佳/优雅方式
【发布时间】:2012-03-11 12:56:29
【问题描述】:

假设我有一个List<SomeObject> a
现在还假设我有另一个List<SomeProcessor> b
每个SomeProcessor 使用a 进行处理。

另外:

int idx = 0;   
for(SomeProcessor o:b){  
    o2 = a.get(idx);  
    o.doSomething(o2);  
    idx++;   
}

有没有更优雅的方法来处理这个问题?

【问题讨论】:

标签: java list arraylist iteration


【解决方案1】:
public interface Processor<T> {
    public void process(T object);
}

然后是一个辅助方法:

public static <T> void processAll(Collection<T> items, Collection<? extends Processor<T>> processors) {
    Iterator<T> i = items.iterator();
    Iterator<? extends Processor<T>> p = processors.iterator();
    while(i.hasNext() && p.hasNext())
        p.next().process(i.next()); 
}

你可以把那个辅助方法放在使用它的类上,如果只有一个(并使它成为private),或者把它放在一个由整个程序共享的实用程序类中。

当然还有其他方法可以编码processAll;例如,您可以在其中一个集合上使用for 循环。但无论如何,将这个低级代码分解成一个辅助方法将使您的高级代码更干净,更少“嘈杂”。如果你在程序的多个部分做类似的事情,他们可以共享辅助方法。

【讨论】:

  • 我不想那样处理。我需要用 1 个处理器处理每个对象一次
  • @narek.gevorgyan:是的,它们的大小总是相同的
  • @Alex D:所以您基本上建议同时使用lists 的两个迭代器,对吧?
  • @Jim,你可以使用一个 for 循环和一个迭代器,或者两个迭代器。在任何一种情况下,为了使代码更简洁,您可以做的最重要的事情就是将这些详细的低级代码移动到一个具有有意义名称的辅助方法中。
  • 不幸的是,Java 没有闭包......如果有的话,你可以编写一个非常好的通用方法来“遍历两个列表并对每一对做一些事情”。跨度>
【解决方案2】:

如果您可以生成一个Map&lt;SomeObject, SomeProcessor&gt; 而不是两个列表,那么它会很优雅。这可能不适用,但我会试一试。

【讨论】:

    【解决方案3】:

    也许你可以试试这个更简单的方法:

    int idx = 0;
    while(idx<a.size() && idx<b.size()){   
        b.get(idx).doSomething(a.get(idx++));
    }
    

    【讨论】:

      猜你喜欢
      • 2017-05-25
      • 2013-05-23
      • 1970-01-01
      • 2010-10-26
      • 2013-01-05
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多