Flatten nested arrays in java

前端 未结 6 676
失恋的感觉
失恋的感觉 2020-12-01 13:32

I want to flatten nested arrays like:

[[[1],2],[3]],4] -> [1,2,3,4] 

manually in java I can\'t find a clue ! :S

I have tried a

6条回答
  •  广开言路
    2020-12-01 14:20

    It could be flattened by iterative approach.

    static class ArrayHolder implements Iterator {
        private final Object[] elements;
        private int index = -1;
    
        public ArrayHolder(final Object[] elements) {
            this.elements = elements;
        }
    
        @Override
        public boolean hasNext() {
            return Objects.nonNull(elements) && ++index < elements.length;
        }
    
        @Override
        public Object next() {
            if (Objects.isNull(elements) || (index == -1 || index > elements.length))
                throw new NoSuchElementException();
    
            return elements[index];
        }
    }
    
    
    private static boolean hasNext(ArrayHolder current) {
        return Objects.nonNull(current) && current.hasNext();
    }
    
    private void flat(Object[] elements, List flattened) {
        Deque stack = new LinkedList<>();
        stack.push(new ArrayHolder(elements));
    
        ArrayHolder current = null;
        while (hasNext(current)
                || (!stack.isEmpty() && hasNext(current = stack.pop()))) {
            Object element = current.next();
    
            if (Objects.nonNull(element) && element.getClass().isArray()) {
                Object[] e = (Object[]) element;
                stack.push(current);
                stack.push(new ArrayHolder(e));
                current = null;
            } else {
                flattened.add(element);
            }
        }
    }
    
    
    

    You can find the full source here You can use recursion to solve this problem.

    private void flat(Object[] elements, List flattened) {
        for (Object element : elements)
        {
            if (Objects.nonNull(element) && element.getClass().isArray())
            {
                flat((Object[])element, flattened);
            }
            else
            {
                flattened.add(element);
            }
        }
    }
    
    
    

    Here is the link for recursion.

    提交回复
    热议问题