繁体   English   中英

如何声明一个数组而不必在 java 中给出固定的初始大小?

[英]How to declare an array without having to give a fixed initial size in java?

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

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();
    }
}

output 是这样的:-

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

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

只需将其声明为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.
}

您可以使用列表而不是使用数组,而无需声明大小。 然后,您可以即时添加项目。 您的 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));
}

我会建议您使用List而不是 arrays,不需要初始大小,您可以根据需要插入元素

List<Integer> arr = new LinkedList<Integer>();

arr.add(5);
....
//Use for loop for adding numbers

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

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

确保您可以通过添加新索引

array_name.add(new array index name); 

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

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];
}

执行以下操作:

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

此外,最好将perform()中的for循环的条件设置为j < arr.length ,以便它完全取决于arr的大小,而不取决于可能在程序的其他部分发生变化的i的值。 出于同样的原因,我在构造函数中将i声明为局部变量,因此它的 scope 仅限于构造函数(需要它的地方),其他任何地方都没有。

代码:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM