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

Java 为什么只在新的arraylist上添加最后一个元素arraylist,java,for-loop,arraylist,duplicates,element,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

目标结果如下: [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();
    }

}
公共类尝试{
ArrayList al=新的ArrayList();
List hm=new ArrayList();
公共无效添加2(){

对于(int j=0;j我发现您的代码实际上无法修复,我会这样做:

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]]"
  }
}
公共类主{
私有静态列表addal2(最终字符串…abc){
最终列表结果=新建ArrayList();
for(最终字符串x:abc){
if(result.isEmpty()){
add(Arrays.asList(x));
继续;
}
最终列表lastList=result.get(result.size()-1);
最终列表newLastList=newarraylist();
newLastList.addAll(lastList);
newLastList.add(x);
结果.添加(newLastList);
}
返回结果;
}
公共静态void main(字符串[]args){
最终列表结果=添加2(“a”、“b”、“c”);
System.out.println(结果);//打印“[[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);
}
publicstaticvoidmain(字符串[]args)引发异常{
List hm=new ArrayList();

对于(int j=0;jp请在您的问题中更具体一点,stackOverflow并不是一个发布半途而废的作业尝试并让我们修复它的地方。您将同一个列表添加三次并更改其内容。与其在循环开始时清除它,不如创建一个新列表。@khelwood我想我可以在每个lo中获得每一个Arraylist alj的op和一次又一次地添加到hm列表中,谢谢
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);
}