【问题标题】:How to declare an array without having to give a fixed initial size in java?java - 如何声明一个数组而不必在java中给出固定的初始大小?
【发布时间】:2020-10-18 07:35:18
【问题描述】:

我试图声明一个数组而不必给出固定的初始大小,因为我想接受用户的大小。这是我想出的最新方法。我可以在声明时给出一个最大可接受的值,但我不想这样做,因为它对空间的使用很差。

class Example{
    int i;
    Scanner in = new Scanner(System.in);
    Example(){
        System.out.println("in constructor");
        System.out.println("enter array size: ");
        i = in.nextInt();
    }
    int[] arr = new int[i];
    void perform(){
        for(int j=0;j<i;j++)
            arr[j] = in.nextInt();
        for(int j=0;j<i;j++)
            System.out.println(arr[j]);
    }
}
public class Main{  
    public static void main(String[] args){
        Example obj = new Example();
        obj.perform();
    }
}

输出是这样的:-

在构造函数中
输入数组大小:
5
1 // 这是我尝试输入数组的第一个元素。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0

【问题讨论】:

  • 这能回答你的问题吗? Variable length (Dynamic) Arrays in Java
  • 不确定这是否有效,因为创建数组时i 将是0。在您的构造函数中分配您的数组。
  • 即使在构造函数中给定了i 的固定值,也会出现同样的错误。
  • @SamagraDev 请通过编辑您的帖子包括您的修改。不要覆盖当前存在的内容,只需将其添加到问题的底部即可。
  • 我没有覆盖任何东西。我只是在问题中添加了输出,没有对最初编写的内容进行任何更改。 @二恶英

标签: java arrays exception java.util.scanner


【解决方案1】:

按如下方式进行:

  1. arr 声明为不带任何大小的实例变量。
  2. 在构造函数中使用用户输入的大小初始化arr

此外,最好将for 循环的条件设置为perform() 内的j &lt; arr.length,这样它完全取决于arr 的大小,而不是i 的值,后者可能会改变程序的其他部分。出于同样的原因,我将i 声明为构造函数内的局部变量,因此它的范围仅限于构造函数(需要它的地方),其他任何地方都没有。

代码:

import java.util.Scanner;

class Example {
    Scanner in = new Scanner(System.in);
    int[] arr;

    Example() {
        System.out.println("in constructor");
        System.out.println("enter array size: ");
        int i = in.nextInt();
        if (i >= 0) {
            arr = new int[i];
        }
    }

    void perform() {
        System.out.println("Enter " + arr.length + " integers");
        for (int j = 0; j < arr.length; j++)
            arr[j] = in.nextInt();
        for (int j = 0; j < arr.length; j++)
            System.out.println(arr[j]);
    }
}

public class Main {
    public static void main(String[] args) {
        Example obj = new Example();
        obj.perform();
    }
}

示例运行:

in constructor
enter array size: 
2
Enter 2 integers
10
20
10
20

【讨论】:

    【解决方案2】:

    从用户那里获取大小后,只需在构造函数中初始化数组即可。您当前正在用户输入任何输入之前初始化数组,此时i 的默认值为0。请参阅下面的代码here

    private final Scanner in = new Scanner(System.in);
    private final int[] arr;
    private final int i;
    Example(){
        System.out.println("in constructor");
        System.out.println("enter array size: ");
        i = in.nextInt();
        arr = new int[i];
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用列表而不用声明大小,而不是使用数组。然后,您可以即时添加项目。 您的 arr 将被替换为

      ArrayList<Integer> myList = new ArrayList<Integer>();
      

      然后您可以添加类似的项目

      myList.add(in.nextInt());
      

      并使用

      访问特定索引处的元素
      myList.get(index);
      

      所以,在你的情况下,它看起来像这样

      ArrayList<Integer> myList = new ArrayList<Integer>();
      void perform(){
          for(int j=0;j<i;j++)
              myList.add(in.nextInt());
          for(int j=0;j<i;j++)
              System.out.println(myList.get(j));
      }
      

      【讨论】:

      • @AlexRundenko 它不会在任何版本中编译,因为 Java 不支持原始泛型类型。但是,如果使用Integer,它将编译。
      • @AlexRudenko 已编辑。打算使用Integer 而不是int。您还需要import java.util.ArrayList
      【解决方案4】:

      ArrayList 是一个更好的选择,你可以在没有固定大小的情况下进行初始化,并且它比经典数组有一些更好的属性。

      ArrayList<datatype> array_name = new ArrayList<datatype>(); 
      

      确定你可以通过

      添加新索引
      array_name.add(new array index name); 
      

      【讨论】:

        【解决方案5】:

        我会推荐你​​使用List而不是数组,不需要初始大小,你可以随意插入元素

        List<Integer> arr = new LinkedList<Integer>();
        
        arr.add(5);
        ....
        //Use for loop for adding numbers
        

        【讨论】:

          【解决方案6】:

          只需将其声明为int[] arr;,但一旦您知道i 有效(即> 0)就分配它。然后你可以在你的循环中使用arr.length

          Example() {
              int i; // Local
              do {
                  System.out.println("enter array size: ");
                  i = in.nextInt();
              } while (i <= 0);
              arr = new int[i];
          }
          
          void perform() {
              for (int j = 0; j < arr.length; j++) {
                  arr[j] = in.nextInt();
              }
              // etc.
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-08-13
            • 1970-01-01
            • 2016-11-05
            • 1970-01-01
            相关资源
            最近更新 更多