Permutation Iterator in java

前端 未结 3 1732
天涯浪人
天涯浪人 2021-01-29 08:57

I want a class, that take in a possitive integer and produce a iterator that let me iterate through all possible of permutation of a list of possitive numbers under the positive

3条回答
  •  半阙折子戏
    2021-01-29 09:50

    An implementation using Heap's Algorithm. It compute next permutations on the fly. And have only one array copying

    
    
    import java.util.Arrays;
    import java.util.Iterator;
    
    class Permutator implements  Iterator{
    
        E[] arr1 = null;
        E[] arr2 = null;
        int size;
        int[] stack = null;
    
        int index = 0;
        public Permutator( E[] arr ){
    
            if( arr.length > 0 ){
                arr1 = arr;
    
                size = arr1.length;
                arr2 = Arrays.copyOf(arr1, size);
    
                stack = new int[size];
                Arrays.fill(stack, 0);
            }
        }
    
        @Override
        public boolean hasNext() {
            return (null != arr1 && arr1.length > 0);
        }
    
        @Override
        public E[] next() {
    
            // start computing.
            // We will return original array as value of last permutation.
            // This is to make "hasNext() " implementation easy.
            updateValue();
            return arr2;
        }
    
        protected void updateValue(){
    
            boolean bret = false;
    
            for( ; index < size ; ){
    
                if( stack[index] < index ){
    
                    if( index %2 == 0 ){
                        swap(0, index);
                    }else{
                        swap(stack[index], index);
                    }
    
                    stack[index]++;           
                    index = 0;
                    bret = true;
                    break;
                }else{
                    stack[index] = 0;
                    index++;
                }
            }
    
            if( !bret ){
                // No more permutation available. 
                // Set the original array as return value.
                // Also set arr1 = null , so that hasNext() will return false for next test
                arr2 = arr1;
                arr1 = null;
            }
        }
    
        private void swap (final int i, final int j) {
            E temp = arr2[i];
            arr2[i] = arr2 [j];
            arr2[j] = temp;
        }
    }
    
    
    

    Usage:

    
    public static void main(String[] args) {
    
            Permutator perm = new Permutator(new Integer[]{1,2,3, 4, 5});
            int count = 0;
            while(perm.hasNext()){
                System.out.println(Arrays.toString(perm.next()));
                count++;
            }
            System.out.println("total: " + count);
        }
    
    

提交回复
热议问题