请教大家一个问题:我想把一个单层list变成一个list套list的 我想这样做的,结果遇到了一个问题,当我把row_data中的值remove或clear掉后,col_data中的值也跟这没有了。有人知道这是怎么回事吗?有什么好的解决方法?目前我想到的就是重新new一个。                List all_data ={"12","45","46","34",,"45","56","78","65","86","73",};
                String onedata = "";
List<String> row_data = new ArrayList<String>();
List<List<String>> col_data = new ArrayList<List<String>>();
for (int i = 0; i < 6; i++) {
onedata = all_data.get(i);
row_data.add(onedata);                   
if(row_data.size()%5==0){
col_data.add(row_data);
row_data.removeAll(row_data);
// row_data=new ArrayList<String>();
}
}

解决方案 »

  1.   

    你在col_data 里添加了row_data对象,然后把这个row_data对象里的全移除了当然col_data里的row_data也没有了,你如果不想影响就用row_data.clone();方法就没问题了。
      

  2.   

    List all_data ={"12","45","46","34",,"45","56","78","65","86","73",}; 
    上面这句能编译能过吗?这不是数组吗?可以用List?
    ArrayList中的remove或clear都是删除引用,怎么可能会没呢。
    楼主好好查查自己的程序,现在贴出来的程序是根本没法运行的。
    ArrayList中的源码如下。
        /**
         * Removes all of the elements from this list.  The list will
         * be empty after this call returns.
         */
        public void clear() {
    modCount++; // Let gc do its work
    for (int i = 0; i < size; i++)
        elementData[i] = null; size = 0;
        }
      

  3.   

    你NEW一个就对了
     List all_data ={"12","45","46","34",,"45","56","78","65","86","73",}; 
     List <String> row_data = null; 
     List <List <String>> col_data = new ArrayList <List <String>>(); 
     for (int i = 0; i < 6; i++) { 
        String onedata = all_data.get(i); 
        if(row_data == null || row_data.size()==5){ 
            row_data=new ArrayList <String>(); 
            col_data.add(row_data); 
        } 
        row_data.add(onedata);
     }
      

  4.   

    import java.util.ArrayList;
    import java.util.List;public class Test {
        public static void main(String[] args) {     List <String> all_data = new ArrayList <String>(); 
         all_data.add("33");
         all_data.add("23");
         all_data.add("573");
         all_data.add("88");
         all_data.add("7d");
         all_data.add("d3");
         all_data.add("23");
         all_data.add("f73");
         all_data.add("8g");
         all_data.add("7f7");
         all_data.add("3f");
         all_data.add("23");
         all_data.add("f73");
         all_data.add("8f8");
         all_data.add("7g");
         all_data.add("888");
             String onedata = ""; 
    List <String> row_data = new ArrayList <String>(); 
    List <List <String>> col_data = new ArrayList <List <String>>(); 
    for (int i = 0; i < all_data.size(); i++) { 
     onedata = all_data.get(i); 
     row_data.add(onedata);                  
      if(row_data.size()%3==0){ 
    col_data.add(row_data); 
    row_data.removeAll(row_data); 
    // row_data=new ArrayList <String>(); 
       } 
            }System.out.println("col_data中的值是:"+col_data.get(0));//col_data中的值是:[888],而预想的是 col_data中的值是:[33, 23, 573]
        }
    }
      

  5.   

    我是想分成多行多列插入到excel中。上面只是一个简单的概述
      

  6.   

    楼主还是没明白java里面值传递的问题。java里面传的是引用,你也可以理解为C或C++里面的指针,当你把row_data做为一个元素添加到col_data里面去,这个时候你操作的数据时被两个引用所指向,任何一个引用对该值进行操作都会影响到另外的一个引用。因此楼主在col_data.add(row_data)之后又做了row_data.romove(row_data)操作,这个时候内存空间里的值已经被你remove掉了,所以col_data里面引用所指向的值也没有了。
      

  7.   

    正如我上面更新的,是有的但是不是我想要的结果,col-data中的值都变成了一样的。能说说你的见解吗?
      

  8.   

    还有我觉得搞col和row有点晕 
    一般来说数组都是竖着看的,因为Arrays.length返回的是行数可以把一个List Row 当做行的集合,然后里面的每一行就是List row_data ,这样想比较轻松吧
      

  9.   

    row_data.clone();怎么没找到这个方法?
      

  10.   

    楼主对于java里面值传递的问题不是很清楚,建议找本介绍java基础的书籍,基本上都会有这部分的内容。基于楼主提出的问题我给出了一下代码作参考:
    public static void main(String[] args) {
    String[] all_data = { "33", "23", "573", "88", "7d", "d3", "23", "f73", "8g", "7f7", "3f", "23", "f73", "8f8",
    "7g", "888" };
    List<List<String>> col_data = new ArrayList<List<String>>();
    int maxCol = 3;
    int maxRow = all_data.length % maxCol == 0 ? all_data.length / maxCol : (all_data.length / maxCol + 1);
    for (int row = 1, index = 0, maxIndex = all_data.length; row <= maxRow; row++) {
    List<String> row_data = new ArrayList<String>();
    for (int col = 1; col <= maxCol && index < maxIndex; col++, index++) {
    row_data.add(all_data[index]);
    }
    col_data.add(row_data);
    }
    for (int i = 0; i < col_data.size(); i++) {
    System.out.println(col_data.get(i).toString());
    }
    }
      

  11.   

    http://blog.csdn.net/huanghr_1/archive/2008/09/21/2958162.aspx
    看看这篇文章,再做做试验,也许你会明白其中的道理。
    纸上得来终觉浅,绝知此事要躬行
      

  12.   

    你没明白对象是如何传递的 我知道你是想通过1个容器往里面倒数据
    你干嘛要remove呢?你吧row_date传进去了,然后传第2个就应该再new一下row_data 这样它就指向一个新的list对象 老的row_date作为一个list对象已经在里面了 如果你没有new的情况下把他remove了这时row_date这个变量同你col_date里的那个list指向的是同一个list,就会把里面那个数据给清空,另一方面 这时你再次放数据到这个row_data 然后再用col_data.add(row_data),这时因为是arraylist 所以他不支持相同的对象,就会导致你没有传进去。
      

  13.   

    另外 remove或者clear是不会把你传进去的第一个row_date对象给删掉的最多删里面的值了
    你觉得删掉的原因是因为你后面那个row_date根本没有传进去