Randomly iterate over ArrayList in Java

后端 未结 5 1388
滥情空心
滥情空心 2020-12-30 14:36

Seems a very basic question. I\'ve an ArrayList al and I would like to iterate over it. Normally,

for(int i : al) {
    // some c         


        
5条回答
  •  庸人自扰
    2020-12-30 14:56

    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();
    

提交回复
热议问题