为什么只在新数组列表上添加最后一个元素数组列表
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]]
这是目标结果: [[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]]