迭代List

时间:2015-11-13 03:25:34

标签: java refactoring

我正在使用Java中的List数据结构。如果列表包含n个列表,则返回通过从每个n列表中拾取元素而形成的n元素列表。

一个例子:

Input:[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
Output:[[1, 3, 5, 7, 9], [2, 4, 6, 8, 10]]

Input:[[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
Output:[[1, 3, 5, 7, 9], [2, 4, 6, 8, 10]]

Input:[[1, 2], [3, 4], [5, 6]]
Output:[[1, 3, 5], [2, 4, 6]]

以下代码有效,但它看起来像一个修复,有没有办法我们可以使用一个for循环来实现它。

public class ListTuple  
{
    @SuppressWarnings({ "unchecked" })
    public static void main(String args[])
    {
       List<List<Integer>> newFinalList = new ArrayList<List<Integer>>();
       List<Integer> newList1 = new ArrayList<Integer>();
       List<Integer> newList2 = new ArrayList<Integer>();
       List<Integer> list1 = Arrays.asList(1 , 2);
       List<Integer> list2 = Arrays.asList(3 , 4);
       List<Integer> list3 = Arrays.asList(5 , 6);
       List<Integer> list4 = Arrays.asList(7 , 8);
       List<Integer> list5 = Arrays.asList(9 , 10);
       List<List<Integer>> finalList = Arrays.asList(list1, list2, list3, list4, list5);
       for (List<Integer> elementOfFinalList : finalList)
       {
          newList1.add(elementOfFinalList.get(0));
       }
       for (List<Integer> elementOfFinalList : finalList)
       {
          newList2.add(elementOfFinalList.get(1));
       }
       newFinalList.add(newList1);
       newFinalList.add(newList2);
       System.out.println("Input:" + finalList);
       System.out.println("Output:" + newFinalList);
  }
}

与此同时,上述代码无效。

Input:[[1, 2, 3], [4, 5, 6]]
Output:[[1, 4], [2, 5], [3, 6]]

任何建议都会有所帮助。

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以将两个for循环压缩为一个

for (List<Integer> elementOfFinalList : finalList)
{
    newList1.add(elementOfFinalList.get(0));
    newList2.add(elementOfFinalList.get(1));
}

这看起来就像它将要获得的那样紧凑

你的意思是什么代码不起作用?您的代码适用于我(使用导入)

这套输入/输出是什么意思?

Input:[[1, 2, 3], [4, 5, 6]]
Output:[[1, 4], [2, 5], [3, 6]]

答案 1 :(得分:0)

这是一些数组类对于你,我从“http://underscorejs.org/”代码引用它。我相信得分不高的源代码是最好的方法之一。


package com.list;

import java.util.ArrayList;

public class ListManagement {

    //picking value of idx and put on the resultList
    //list must be contained two depth list
    public static ArrayList map(ArrayList lists,int idx){

        ArrayList resultList = new ArrayList();

        for(ArrayList list : lists){
            resultList.add(list.get(idx));
        }

        return resultList;
    }

    //  Size Return
    public static int getLength(ArrayList lists){
        int resultLength = 0;
        for(ArrayList list : lists){
            resultLength = list.size() > resultLength ? list.size() : resultLength;
        }
        return resultLength;
    }

    public static ArrayList unzip(ArrayList lists){
        int length = getLength(lists);
        ArrayList resultList = new ArrayList();

        for(int j = 0; j  lists){
        ArrayList resultList = unzip(lists);

        return resultList;
    }

    public static void main(String[] args) {
        ArrayList list1 = new ArrayList();
        list1.add("aaa");
        list1.add("111");
        list1.add("!!!");
        list1.add("AAA");

        ArrayList list2 = new ArrayList();
        list2.add("bbb");
        list2.add("222");
        list2.add("@@@");
        list2.add("BBB");

        ArrayList list3 = new ArrayList();
        list3.add("ccc");
        list3.add("333");
        list3.add("###");
        list3.add("CCC");

        ArrayList mainList = new ArrayList();
        mainList.add(list1);
        mainList.add(list2);
        mainList.add(list3);

        ArrayList resultList = ListManagement.unzip(mainList);
        System.out.println("Un-Zipped Array : "+resultList);

        resultList = ListManagement.zip(resultList);
        System.out.println("Zipped Array : "+resultList);

    }

}

这是结果

Un-Zipped Array : [[aaa, bbb, ccc], [111, 222, 333], [!!!, @@@, ###], [AAA, BBB, CCC]]
Zipped Array : [[aaa, 111, !!!, AAA], [bbb, 222, @@@, BBB], [ccc, 333, ###, CCC]]