ArrayList大小作为变量



为什么我不能将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.
... 

这只是一个小例子。但你可以在这里或这里找到更多(更好)的信息

希望这能帮助

正如其他人已经指出的,这确实是一个范围问题。变量maxSizeif块中与一起出生和死亡(在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++ ) {
}

只是要注意平衡可读性。

最新更新