Make iterators cloneable?

Louis Wasserman lowasser at google.com
Sat Sep 10 22:39:49 UTC 2016


Jonathan, I think Dave's point is that you cannot start the inner iteration
from the same point as the first iteration.  This is true; the API does not
provide a good way to do that.

(I have always perceived this as working-as-intended; that iterators are
not in general cloneable, and that there really is no sane way to do this
other than converting to an index-based collection.)

On Sat, Sep 10, 2016 at 3:37 PM Jonathan Bluett-Duncan <
jbluettduncan at gmail.com> wrote:

> Hi Dave,
>
> Rather than using Iterator.clone(), how about you just call
> collection.iterator() 2 times to return 2 unique, non-same iterators;
> something like the following:
>
> import java.util.Collections;
> import java.util.Iterator;
> import java.util.Set;
> import java.util.concurrent.ConcurrentHashMap;
>
> public class Example {
>   public static void main(String[] args) {
>     Set<String> s = Collections.newSetFromMap(new
> ConcurrentHashMap<String, Boolean>());
>
>     s.add("Fee");
>     s.add("Fi");
>     s.add("Fo");
>     s.add("Fum");
>
>     Iterator<String> it1 = s.iterator();
>     for (String v1 = null; it1.hasNext(); v1 =it1.next()) {
>       Iterator<String> it2 = s.iterator(); // a completely separate
> iterator to it1
>       for (String v2 = null; it2.hasNext(); v2 = it2.next()) {
>         System.out.println(v1 + " <-->" + v2);
>       }
>     }
>   }
> }
>
>
> Or, even better, if you're using Java 5+, you can skip using Iterators
> altogether and use for-loops directly:
>
> import java.util.Collections;
> import java.util.Set;
> import java.util.concurrent.ConcurrentHashMap;
>
> public class Example {
>   public static void main(String[] args) {
>     Set<String> s = Collections.newSetFromMap(new
> ConcurrentHashMap<String, Boolean>());
>
>     s.add("Fee");
>     s.add("Fi");
>     s.add("Fo");
>     s.add("Fum");
>
>     for (String v1 : s) {
>       for (String v2 : s) {
>         System.out.println(v1 + "<-->" + v2);
>       }
>     }
>   }
> }
>
>
> Kind regards,
> Jonathan
>
> On 10 September 2016 at 23:13, Dave Brosius <dbrosius at mebigfatguy.com>
> wrote:
>
> > It would be nice to be able to associate each element in a collection
> with
> > another element in the collection, which is something very easily done
> with
> > index based collections, but with sets, etc this isn't so easy... unless
> > i'm having a brainfart.
> >
> > So i'd like to do this, but Iterator doesn't implement Cloneable... Any
> > reason not to? or is there another way that's missing me?
> >
> > public class ItClone {
> >
> >     public static void main(String[] args) {
> >         Set<String> s = Collections.newSetFromMap(new
> > ConcurrentHashMap<String, Boolean>());
> >
> >         s.add("Fee");
> >         s.add("Fi");
> >         s.add("Fo");
> >         s.add("Fum");
> >
> >         Iterator<String> it1 = s.iterator();
> >         while (it1.hasNext()) {
> >             String v1 = it1.next();
> >
> >             Iterator<String> it2 = (Iterator<String>) it1.*clone*();
> >             while (it2.hasNext()) {
> >                 String v2 = it2.next();
> >
> >                 System.out.println(v1 + " <-->" + v2);
> >             }
> >         }
> >     }
> > }
> >
>


More information about the core-libs-dev mailing list