[英]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];
}
执行以下操作:
arr
声明为不带任何大小的实例变量。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.