java語言 flatten(Object[] objs){} 方法

flatten() 我自己理解就是一個將N維數組壓成一個一維數組並返回的東西,

private static Object[] flatten(Object[] objs) {
        LinkedList<Object> list = new LinkedList<Object>(),
                           slist = new LinkedList<Object>(); 

        Collections.addAll(list, objs);

        Object end = new Object(); 
        int id = end.hashCode();
        list.addLast(end);

        while(list.getFirst().hashCode() != id) {

            if( list.getFirst() instanceof Object[]) {

                Object[] first = (Object[])list.removeFirst();

                for(int i = 0; i<first.length; i++ ) {

                    if(first[i] instanceof Object[]) {

                        for(int j = i; i < first.length; ++i) {

                            list.addFirst(
                            first[first.length - 1 - (i - j)]); 
                        }
                    } 

                    else slist.addLast(first[i]);
                }       
            } 

            else {

                slist.addLast(list.getFirst());

                list.removeFirst();
            }
        }

        return slist.toArray();

    }

具體的想法就是,給你一串Object[] 數組(標記list1),這裏面可能包含多重嵌套的數組,
例如: [“ssss”, 1, 2, [123, 355, “ssss”], 1, 45]
現在要求輸出的要求輸出的順序是:
“ssss”, 1, 2, 123, 355, “ssss”, 1, 45
這時候,你可以用一個LinkedList(標記list2)來保存Object[] 數組,然後
1.每次從首部取list1數組的第一個元素,遍歷,
2.如果不是數組,就放在list2裏面,
3.如果是數組就放在首部,繼續執行第一步
這樣就能保證,如果list1取出來的第一個元素還是數組的話就繼續遍歷,直到不是數組爲止,這樣在list2中的元素的順序就得到了保證,返回的就是一個正確的順序。

要說技巧的話,就是第二步裏面,如果是數組的話,就馬上結束對list1的遍歷,並且將得到的這個子數組放回 list1的首部,這樣就避免了數組元素過多,爆棧了。

發佈了23 篇原創文章 · 獲贊 8 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章