【问题标题】:Java: iterating through list of lists?Java:遍历列表列表?
【发布时间】:2011-02-16 11:52:42
【问题描述】:

The question but in C#. 那么Java有C#的命令吗?我需要它来处理 Matches-SearchTerm-Files-relationship。

foreach(var i in BunchOfItems.SelectMany(k => k.Items)) {}

[为什么不用 for 循环?] 我已经在嵌套的 for 循环中完成了这样的结构,但它们很快就会变得臃肿。所以我更喜欢上面这样更简洁的东西。

public static Stack<Integer[]> getPrintPoss(String s,File f,Integer maxViewPerF)
{
    Stack<File> possPrint = new Stack<File>();
    Integer[] poss = new Integer[4]();
    int u,size;
    for(File f:files)
    { 
        size = f2S(f).length();
        u = Math.min(maxViewsPerF,size);
        for(int i=0; i<u;i++)
        {
           // Do something --- bloated, and soon out of control
           // wants more succintly

        }
    }
    return possPrint;
}

【问题讨论】:

标签: java list iteration


【解决方案1】:
for (List<Object> lo : list) {
    for (Object o : lo) {
        // etc etc
    }
}

我认为没有更简单的解决方案。

【讨论】:

  • OP 要求 C# 提供的 Linq 类型的解决方案。他已经知道如何遍历列表。他想要一个优雅的解决方案。不幸的是,Java 没有与 Linq 等效的东西。
【解决方案2】:

如果您可以将数据放入 Iterable&lt;Iterable&lt;T&gt;&gt;,那么您可以使用 Guava 的 Iterables.concat 方法将数据转换为扁平的 Iterable&lt;T&gt;。如果你真的是一个Iterable&lt;S&gt;,通过某种方式从SIterable&lt;T&gt;,那么你必须首先使用Iterables.transform 来查看Iterable&lt;Iterable&lt;T&gt;&gt; 所需的@987654330 @。

如果 Java 有类似闭包的东西,这一切看起来会好很多,但至少在今天是可能的。

http://guava-libraries.googlecode.com

【讨论】:

    【解决方案3】:

    使用 Java 8,你可以说

    Collection bunchOfItems = ...;
    bunchOfItems.stream().flatMap(k::getItems).forEach(i -> /* operate on i */);
    

    Item[] bunchOfItems = ...;
    Stream.of(bunchOfItems).flatMap(k::getItems).forEach(i -> /* operate on i */);
    

    取决于您是否拥有CollectionArray

    【讨论】:

    • 你能在这里解释一下你的代码吗?
    【解决方案4】:

    在 JDK7 最终版(包括Closures)之前有大约半年的耐心。这提供了与您正在谈论的答案中演示的 LINQ 类似的语法和相同的可能性。

    【讨论】:

      【解决方案5】:

      我有自己的版本。拼命等待 Java 中的 闭包

      public static <T, E> Iterable<T> transformMany(Iterable<E> iterable, Func<E, Iterable<T>> f) {
          if (null == iterable)
              throw new IllegalArgumentException("null iterable");
          if (null == f)
              throw new IllegalArgumentException("null f");
      
          return new TransformManyIterable<E, T>(iterable, f);
      }
      
      public interface Func<E, T> {
          T execute(E e);
      }
      
      public class TransformManyIterable<TOriginal, TResult> implements Iterable<TResult> {
          private Iterable<TOriginal> iterable;
          private Func<TOriginal, Iterable<TResult>> func;
      
          public TransformManyIterable(Iterable<TOriginal> iterable,
                  Func<TOriginal, Iterable<TResult>> func) {
              super();
              this.iterable = iterable;
              this.func = func;
          }
      
          class TransformIterator implements Iterator<TResult> {
              private Iterator<TOriginal> iterator;
              private Iterator<TResult> currentIterator;
      
              public TransformIterator() {
                  iterator = iterable.iterator();
              }
      
              @Override
              public boolean hasNext() {
                  if (currentIterator != null && currentIterator.hasNext())
                      return true;
                  else {
                      while (iterator.hasNext()) {
                          Iterable<TResult> iterable = func.execute(iterator.next());
                          if (iterable == null)
                              continue;
                          currentIterator = iterable.iterator();
                          if (currentIterator.hasNext())
                              return true;
                      }
                  }
      
                  return false;
              }
      
              @Override
              public TResult next() {
                  if (currentIterator != null && currentIterator.hasNext())
                      return currentIterator.next();
                  else {
                      while (iterator.hasNext()) {
                          Iterable<TResult> iterable = func.execute(iterator.next());
                          if (iterable == null)
                              continue;
                          currentIterator = iterable.iterator();
                          if (currentIterator.hasNext())
                              return currentIterator.next();
                      }
                  }
                  throw new NoSuchElementException();
              }
      
              @Override
              public void remove() {
                  throw new UnsupportedOperationException();
              }
          }
      
          @Override
          public Iterator<TResult> iterator() {
              return new TransformIterator();
          }
      
      }
      

      用法:

          Iterable<SomeType> result = transformMany(input, new Func<InputType, Iterable<SomeType>>() {
              @Override
              public Iterable<SomeType> execute(InputType e) {
                  return new ArrayList<SomeType>();
              }
          });
      

      【讨论】:

        【解决方案6】:

        SelectMany 方法是 .Net 特定的 LINQ 的一部分。 This question 询问 java 的 LINQ 等效项。不幸的是,它似乎没有直接的等价物。

        【讨论】:

          猜你喜欢
          • 2016-10-09
          • 2010-12-18
          • 2023-03-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多