如何将ArrayList <e>拆分为ArrayList <arraylist <e>&gt;?

时间:2015-10-22 15:18:08

标签: java arraylist

我对java很新,并尝试从ArrayList<ArrayList<Integer>>创建ArrayList<Integer>(将28800个数据点拆分为300个)。

public static ArrayList<ArrayList<Integer>> createListOfArrays(ArrayList<Integer> list) {

    ArrayList<ArrayList<Integer>> listOfArrays = new ArrayList<ArrayList<Integer>>();
    ArrayList<Integer> temp = new ArrayList<Integer>();

    for (int i = 0; i < list.size(); i++) {
        int arrayInt = list.get(i);
        temp.add(arrayInt);

        if (temp.size() % 300 == 0) {
            listOfArrays.add(temp);
            temp.clear();
        }
    }

    return listOfArrays;    

    System.out.println(listOfArrays.size());
    System.out.println(listOfArrays.get(0).size());
}

我的打印陈述给出了正确的96 ArrayLists大小,但它们都是空的。如果我删除temp.clear(),则所有内容都包含28800 Integers

96 * 300中我需要ArrayLists个不同的Arraylist

3 个答案:

答案 0 :(得分:1)

它们是空的,因为您在添加后立即清除列表 - 将temp添加到listOfArrays不会复制它。您只需将同一列表添加到listOfArrays很多次。

使用List.subList从列表中提取300个元素块,您可以更轻松地完成此任务:

for (int i = 0; i < list.size(); i += 300) {
  // Extract a view of this block of (up to) 300 elements.
  List<E> subList = list.subList(i, Math.min(i+300, list.size()));
  // Copy it into a new list since we require an ArrayList to add
  // to `listOfArrays`.
  ArrayList<E> copy = new ArrayList<>(subList);
  // Put it into the result.
  listOfArrays.add(copy);
}

答案 1 :(得分:1)

 public static ArrayList<ArrayList<Integer>> createListOfArrays(ArrayList<Integer> list) {

 ArrayList<ArrayList<Integer>> listOfArrays = new ArrayList<ArrayList<Integer>>();
 ArrayList<Integer> temp = new ArrayList<Integer>();

 for (int i = 0; i < list.size(); i++) {
     int arrayInt = list.get(i);
     temp.add(arrayInt);

     if (i % 300 == 0) {
         listOfArrays.add(temp);
         //assigning new ArrayList object in temp
         temp = new ArrayList<Integer>();
     }

 }
 //adding last batch of temp to listOfArrays
 if(temp.size()>0){
         listOfArrays.add(temp);
  }

 return listOfArrays;    

 System.out.println(listOfArrays.size());
 System.out.println(listOfArrays.get(0).size());
 }

这应该可以帮到你。上述评论中提供的解释。

答案 2 :(得分:0)

for (int i = 0; i < list.size(); i++) {
    Integer arrayInt = list.get(i);
    temp.add(arrayInt);

    if (temp.size() % 300 == 0) {
        listOfArrays.add(temp);
        temp = new ArrayList<>();
    }
}
  

从列表中检索元素时不要使用原始int。因为它会不必要地再次导致unboxing然后autoboxing

     

您应该更改逻辑,而不是依赖list.size() % 300 == 0

您甚至可以使用arraylist方法subList