Hi, digging a little bit in the bug database, there is a bug from 1999 https://bugs.openjdk.java.net/browse/JDK-4244952
answers seems to be - having different iterators on the same collection is error prone because iterators are failfast, the proposed workaround to use an array or a List with several indexes - it's too C++ish, C++ defines clone and equals, Java tries to define a simpler iteration protocol (from now, given that this question is raised only once in a while, it's doesn't seem to be a bad idea) - iterators are interfaces, so having several iterators means several virtual dispatch calls (this one is not true anymore because any JITs routinely devirtualize this kind of call). cheers, Rémi ----- Mail original ----- > De: "Dave Brosius" <dbros...@mebigfatguy.com> > À: "Louis Wasserman" <lowas...@google.com>, "Jonathan Bluett-Duncan" > <jbluettdun...@gmail.com> > Cc: core-libs-dev@openjdk.java.net > Envoyé: Dimanche 11 Septembre 2016 02:23:41 > Objet: Re: Make iterators cloneable? >>> Iterators reading from a BufferedReader > > yes that's true. altho given the contract of Cloneable, adding the clone > method on Iterator would be safe, as it would only be available if the > real implementing class 'extends Cloneable'... it's actually kind of > funny that Object methods aren't available on interface references, anyway. > > > But i get the "age of Iterator" answer.. Shame there isn't an answer, tho. > > thanks, dave > > On 09/10/2016 07:44 PM, Louis Wasserman wrote: >> Some iterators might be. Many may not be. Certainly Iterator as an >> interface has been out there for long enough there are Iterator >> implementations out there that aren't cloneable -- say, Iterators >> reading from a BufferedReader, where there really won't be any way to >> do what you're hoping for; BufferedReaders certainly aren't cloneable. >> >> On Sat, Sep 10, 2016 at 4:33 PM Dave Brosius <dbros...@mebigfatguy.com >> <mailto:dbros...@mebigfatguy.com>> wrote: >> >> Yes Louis is correct. >> >> I want the pair wise associations or all elements of a set. >> >> Fee-Fi >> >> Fee-Fo >> >> Fee-Fum >> >> Fi-Fo >> >> Fi-Fum >> >> Fo-Fum >> >> >> the independent iterators produce Fee-Fee (etc) as well as the >> duplicate Fee-Fi and Fi-Fee (etc), both of which i don't want. >> >> >> This is obviously simplistic with index based collections, but not >> with sets/maps >> >> I don't see why an Iterator isn't by nature easily cloneable. >> >> >> >> On 09/10/2016 06:45 PM, Jonathan Bluett-Duncan wrote: >>> Ah okay Louis, if that's the case then that certainly makes >>> sense, and I'd agree that there's no good way of doing so, as one >>> would need to copy the set into a list. >>> >>> Dave, did Louis hit the mark? If not, would you kindly go into >>> further detail as to exactly what it is you're trying to do? >>> >>> Best, >>> Jonathan >>> >>> On 10 September 2016 at 23:36, Jonathan Bluett-Duncan >>> <jbluettdun...@gmail.com <mailto:jbluettdun...@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 >>> <dbros...@mebigfatguy.com <mailto:dbros...@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); } >>> } } }