为什么只在新数组列表上添加最后一个元素数组列表

why only adding last element arraylist on new arraylist

这是目标结果: [[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只是加了最后一个元素?

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

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]]"
  }
}

最后一个元素没有添加到 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]]