【问题标题】:ArrayList size as a variableArrayList 大小作为变量
【发布时间】:2022-11-17 12:37:33
【问题描述】:

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

是一个整数

【问题讨论】:

  • 当然你可以保存它们,你正在这样做,但是你在那些 if-else 块中声明了这些整数,这意味着它们不存在于它们的范围之外。在 if 之前声明变量,然后在 if-else 块中分配值即可解决您的问题
  • 您在花括号内定义变量。它不存在于那些大括号之外。这称为变量的范围。
  • 您需要更多地了解范围。目前你的变量 maxSize 只在 if 的范围内工作。
  • 你误解了你得到的错误。当然,您可以将大小保存在一个 in t 变量中,并在代码中的 2 个位置执行此操作。但是,您的错误是您尝试在其范围之外使用那些 maxSize 变量。见What is 'scope' in Java?

标签: java arraylist


【解决方案1】:

TLDR;

只需在 if 和 else 语句上方声明 maxSize 即可。鲍勃是你的叔叔。然后你可以在你的方法/函数中的任何地方使用 maxSize 。

解决方案

这是范围问题。要解决您的问题,请在 if-else 语句的括号外声明变量 (maxSize)。 当您在括号中声明它们时,您将只能在它们(作用域)内使用它们。

int maxSize = 0;
if (list1.size() >= list2.size()) {
    maxSize = list1.size(); 
} else {
    maxSize = list2.size();
}

// Use maxSize as you wish :)

笔记:

  • 正如@berse2212 所指出的,如果您向数组添加或删除项目,则需要再次更新您的 maxSize。
  • 另外,就像 @so-random-dude 显示的那样,您可以用这个 gem 替换 if else 语句:

int maxSize = Math.max(list1.size(), list2.size());

Scope 究竟是关于什么的?

范围定义变量的生命周期。让我们更深入地了解您的示例。为简单起见,让我们忽略 else。

...
    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.
... 

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

希望这可以帮助

【讨论】:

  • 只是一个小的添加 - 如果将大小存储在变量中要小心,因为当 ArrayList 的大小增加或减少时它不会更新。
  • @berse2212 好点,我添加到答案中是为了完整性 :)
  • 将 maxSize 初始化为 0 有什么好处吗?是的,我知道,“所有变量都必须初始化!!!!”但是你初始化 maxSize,在第 3 行或第 5 行。据我所知,如果您忘记了其中一个分支中的真正初始化,此虚拟初始化的唯一效果是抑制编译器警告。
【解决方案2】:

正如其他人已经指出的那样,这确实是一个范围问题。变量 maxSizeif 块中诞生和消亡(在 else 块中再次使用另一个同名的变量 - 看,即使您有 2 个同名的引用变量,编译器也没有抱怨,一个在 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 只是一个转移注意力的东西,也许您可​​以自己想出这一切。

【讨论】:

    【解决方案3】:

    该变量的作用域为if,在外部声明它以将其引入作用域:

    int maxSize;
    if (condition) {
       maxSize = ... 
    } else {
       maxSize = ... 
    }
    // now can be used in the for
    for (int i = 0; i < maxSize; i++ ) {
    }
    

    正如another answer 所指出的,您还可以使用三元运算符

    int maxSize = list1.size() >= list2.size() ? list1.size() : list2.size(); 
    for (int i = 0; i < maxSize; i++ ) {
    }
    

    请注意平衡可读性。

    【讨论】:

      猜你喜欢
      • 2022-01-19
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多