为什么我不能将ArrayList大小保存为变量?
public static ArrayList <Integer > merge(ArrayList <Integer > list1,
ArrayList <Integer > list2 ) {
if (list1.size() >= list2.size()) {
int maxSize = list1.size();
} else {
int maxSize = list2.size();
}
for (int i = 0; i < maxSize; i++) {
if (i <= list2.size()) {
int nextInList2 = list2.get(i);
list1.add(i, nextInList2);
}
}
System.out.println(list1);
return (list1);
在:int maxSize=list1.size();我认为它没有按照我的意愿保存变量。
我认为
list1.size()
是一个整数
TLDR
只需在if和else语句之上声明maxSize即可。鲍勃是你的叔叔。然后,您可以在方法/函数中的任何位置使用maxSize。
解决方案
这是一个范围问题。要解决您的问题,请在if-else语句的括号外声明变量(maxSize)。当您在括号中声明它们时,您将只能在其中使用它们(范围)。
int maxSize = 0;
if (list1.size() >= list2.size()) {
maxSize = list1.size();
} else {
maxSize = list2.size();
}
// Now maxSize can be used as you wish :)
for (int i = 0; i < maxSize; i++) { ...
注意:
- 正如@berse2212所指出的,如果向数组中添加或删除项目,则需要再次更新maxSize
- 此外,就像@so random dude显示的那样,你可以用这个宝石代替if-else语句:
int maxSize=Math.max(list1.size(),list2.size());
Scope到底是关于什么的
作用域定义变量的生存期。让我们更深入地看看你的例子。为了简单起见,让我们忽略其他内容。
...
if (list1.size() >= list2.size()) {
// Start If statement's Scope.
int maxSize = list1.size(); // Add maxSize to scope
// Max Size is in scope and can be used as you wish
// End the scope, in other words, maxSize does not exist anymore.
}
// maxSize has left the building, and the compiler does not know about it.
...
这只是一个小例子。但你可以在这里或这里找到更多(更好)的信息
希望这能帮助
maxSize
在if
块中与一起出生和死亡(在else
块中又有一个同名的变量-请参阅,即使您有两个同名的引用变量,一个在if块中,另一个在else块中,编译器也没有抱怨-因为编译器知道您在if
中创建的maxSize
超出了else
的范围)。
Reg给出的是正确的解决方案
以下只是一种不同的、简洁的方法来解决问题
您可以像这个一样使用三元运算符
int maxSize = (list1.size() >= list2.size()) ? list1.size() : list2.size();
或者更好的
int maxSize = Math.max(list1.size(), list2.size());
此外,下次当你问这个问题时,试着孤立问题,消除所有不必要的细节。例如,在这种情况下,如果您尝试过
if (true) {
int maxSize = 1;
} else {
int maxSize = 2;
}
System.out.println(maxSize); // Compiler will scream at you.
你本可以避免谈论arrayList,找到问题的症结所在。看,arrayList只是转移注意力,也许你可以自己想清楚。
变量的作用域为if
,在外部声明以将其带入作用域:
int maxSize;
if (condition) {
maxSize = ...
} else {
maxSize = ...
}
// now can be used in the for
for (int i = 0; i < maxSize; i++ ) {
}
正如另一个答案所指出的,你也可以使用三元运算符
int maxSize = list1.size() >= list2.size() ? list1.size() : list2.size();
for (int i = 0; i < maxSize; i++ ) {
}
只是要注意平衡可读性。