Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>This one works for me - it is not generalised to <code>Collection</code> but there are utility methods that can give you an iterator-iterator across up to three levels of <code>Map</code>. I am sure you could adapt it to collections in general.</p> <pre><code>public class NestedIterator&lt;T&gt; implements Iterator&lt;T&gt; { // Outer iterator. Goes null when exhausted. Iterator&lt;Iterator&lt;T&gt;&gt; i2 = null; // Inner iterator. Goes null when exhausted. Iterator&lt;T&gt; i1 = null; // Next value. T next = null; // Takes a depth-2 iterator. public NestedIterator(Iterator&lt;Iterator&lt;T&gt;&gt; i2) { this.i2 = i2; // Prime the pump. if (i2 != null &amp;&amp; i2.hasNext()) { i1 = i2.next(); } } @Override public boolean hasNext() { // Is there one waiting? if (next == null) { // No! // i1 will go null if it is exhausted. if (i1 == null) { // i1 is exhausted! Get a new one from i2. if (i2 != null &amp;&amp; i2.hasNext()) { /// Get next. i1 = i2.next(); // Set i2 null if exhausted. if (!i2.hasNext()) { // Exhausted. i2 = null; } } else { // Exhausted. i2 = null; } } // A null i1 now will mean all is over! if (i1 != null) { if (i1.hasNext()) { // get next. next = i1.next(); // Set i1 null if exhausted. if (!i1.hasNext()) { // Exhausted. i1 = null; } } else { // Exhausted. i1 = null; } } } return next != null; } @Override public T next() { T n = next; next = null; return n; } @Override public void remove() { throw new UnsupportedOperationException("Not supported."); } // Iterating across Maps of Maps of Maps. static &lt;K1, K2, K3, V&gt; Iterator&lt;Iterator&lt;Iterator&lt;V&gt;&gt;&gt; iiiV(Map&lt;K1, Map&lt;K2, Map&lt;K3, V&gt;&gt;&gt; mapMapMap) { final Iterator&lt;Map&lt;K2, Map&lt;K3, V&gt;&gt;&gt; mmi = iV(mapMapMap); return new Iterator&lt;Iterator&lt;Iterator&lt;V&gt;&gt;&gt;() { @Override public boolean hasNext() { return mmi.hasNext(); } @Override public Iterator&lt;Iterator&lt;V&gt;&gt; next() { return iiV(mmi.next()); } @Override public void remove() { mmi.remove(); } }; } // Iterating across Maps of Maps. static &lt;K1, K2, V&gt; Iterator&lt;Iterator&lt;V&gt;&gt; iiV(Map&lt;K1, Map&lt;K2, V&gt;&gt; mapMap) { final Iterator&lt;Map&lt;K2, V&gt;&gt; mi = iV(mapMap); return new Iterator&lt;Iterator&lt;V&gt;&gt;() { @Override public boolean hasNext() { return mi.hasNext(); } @Override public Iterator&lt;V&gt; next() { return iV(mi.next()); } @Override public void remove() { mi.remove(); } }; } // Iterating across Map values. static &lt;K, V&gt; Iterator&lt;V&gt; iV(final Map&lt;K, V&gt; map) { return iV(map.entrySet().iterator()); } // Iterating across Map.Entries. static &lt;K, V&gt; Iterator&lt;V&gt; iV(final Iterator&lt;Map.Entry&lt;K, V&gt;&gt; mei) { return new Iterator&lt;V&gt;() { @Override public boolean hasNext() { return mei.hasNext(); } @Override public V next() { return mei.next().getValue(); } @Override public void remove() { mei.remove(); } }; } } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload