Seems a very basic question. I\'ve an ArrayList and I would like to iterate over it. Normally,
for(int i : al) {
// some c
How about this way (more functional); it even includes a main() to demonstrate. Basically, generate random numbers in the range of your list size until you have 1 of them all. We use HashSet to take care of duplicate random numbers in our range. Then, delegate iteration to the iterator of your index hashset. Logic of "hasNext()" becomes trivial through delegate.
public class RandomIterator implements Iterator {
private Iterator indicies;
List delegate;
public static void main(String[] args) {
Random r = new Random();
List numbers = IntStream.generate(r::nextInt).limit(10).boxed().collect(toCollection(ArrayList::new));
List results = new ArrayList<>();
for(RandomIterator test = new RandomIterator<>(numbers); test.hasNext(); ) {
results.add(test.next());
}
System.out.println("In list: " + numbers);
System.out.println("random iteration " + results);
if(results.containsAll(numbers) && results.size() == numbers.size())
System.out.println("Everything accounted for");
else
System.out.println("Something broke!");
}
public RandomIterator(List delegate) {
Random r = new Random();
this.delegate = delegate;
Set indexSet = new LinkedHashSet<>();
while(indexSet.size() != delegate.size())
indexSet.add(r.nextInt(delegate.size()));
System.out.println(indexSet);
indicies = indexSet.iterator();
}
@Override
public boolean hasNext() {
return indicies.hasNext();
}
@Override
public T next() {
return delegate.get(indicies.next());
}
}
If you just want an print 100 random numbers:
IntStream.generate(r::nextInt).limit(100).forEach(System.out::println);
if you want an iterator (for whatever reason:)
IntStream.generate(r::nextInt).limit(100).boxed().collect(Collectors.toList()).iterator();