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