Make iterators cloneable?

Jonathan Bluett-Duncan jbluettduncan at gmail.com
Sat Sep 10 22:36:22 UTC 2016


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