为什么只在新的arraylist上添加最后一个元素arraylist

时间:2015-05-30 23:00:47

标签: java for-loop arraylist duplicates element

目标结果如下: [A],[A,B],[A,B,C]]

但是当我运行我的代码时,结果是: [[A,B,C],[A,B,C],[A,B,C]]

这是源代码:

public class Try {


    ArrayList<String> al=new ArrayList<String>();
    List<List<String>> hm=new ArrayList<List<String>>();


    public void addal2(){
        for(int j=0; j<3;j++){
            al.clear();
            for(int i=0; i<1;i++){
                if(j==0){al.add("a");}
                else if(j==1){al.add("a");al.add("b");}
                else if(j==2){al.add("a");al.add("b");al.add("c");}
            }
            hm.add(al);
        }
        System.out.println("hm final"+hm);
    }

    public static void main(String[] args) {
        // TODO code application logic here
        Try c = new Try();
        c.addal2();
    }

}

请告诉我为什么结果是这样的HM只是添加最后一个元素?

2 个答案:

答案 0 :(得分:1)

最后一个元素没有添加到HM中,您要向HM添加对同一列表的引用。

迭代1:HM = [“a”]

迭代2:HM = [[“a”,“b”],[“a”,“b”]]

迭代3:HM = [[“a”,“b”,“c”],[“a”,“b”,“c”],[“a”,“b”,“c”] ]

这很容易解决,而不是清除列表,只需重新实例化。

public static void main(String[] args) throws Exception {
    List<List<String>> hm = new ArrayList();

    for(int j=0; j<3;j++){
        List<String> al = new ArrayList();
        for(int i=0; i<1;i++){
            if(j==0){al.add("a");}
            else if(j==1){al.add("a");al.add("b");}
            else if(j==2){al.add("a");al.add("b");al.add("c");}
        }
        hm.add(al);
    }
    System.out.println("hm final"+hm);
}

结果:

  

hm final [[a],[a,b],[a,b,c]]

更新

至于清理代码以使其更简单,您可以尝试以下方法:

public static void main(String[] args) throws Exception {
    List<List<String>> hm = new ArrayList();
    String alphabet = "abcdefghijklmnopqrstuvwxyz";

    // Change the 3 to any number from 1 - 26
    for (int i = 0; i < 3; i++) {
        List<String> al = new ArrayList();
        for (int j = 0; j <= i; j++) {
            al.add(String.valueOf(alphabet.charAt(j)));
        }
        hm.add(al);
    }
    System.out.println(hm);
}

结果:

  

[[a],[a,b],[a,b,c]]

答案 1 :(得分:-1)

我发现您的代码无法修复,我会这样做:

public class Main {
  private static List<List<String>> addal2(final String... abc) {
    final List<List<String>> result = new ArrayList<>();
    for (final String x : abc) {
        if (result.isEmpty()) {
            result.add(Arrays.asList(x));
            continue;
        }
        final List<String> lastList = result.get(result.size() - 1);
        final List<String> newLastList = new ArrayList<>();
        newLastList.addAll(lastList);
        newLastList.add(x);
        result.add(newLastList);
    }
    return result;
  }

  public static void main(String[] args) {
    final List<List<String>> result = addal2("a", "b", "c");
    System.out.println(result); // Prints "[[a], [a, b], [a, b, c]]"
  }
}