如何声明一个数组而不必在 java 中给出固定的初始大小?
How to declare an array without having to give a fixed initial size in java?
我正在尝试声明一个数组而不必提供固定的初始大小,因为我想接受用户的大小。这是我想出的最新方法。我可以在声明时给出最大可接受值,但我不想这样做,因为它对 space.
的使用不当
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
只需将其声明为 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.
}
我会推荐你使用 List
而不是数组,不需要初始大小,你可以随意插入元素
List<Integer> arr = new LinkedList<Integer>();
arr.add(5);
....
//Use for loop for adding numbers
您可以使用列表来代替数组,而无需声明大小。然后您可以即时添加项目。
您的 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));
}
ArrayList 是一个更好的选择,你可以在没有固定大小的情况下进行初始化,并且它比经典数组有一些更好的属性。
ArrayList<datatype> array_name = new ArrayList<datatype>();
确定您可以通过
添加新索引
array_name.add(new array index name);
从用户那里获取大小后,只需在构造函数中初始化数组即可。您当前正在用户输入任何输入之前初始化数组,此时 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];
}
按如下操作:
- 声明
arr
没有任何大小并作为实例变量。
- 在构造函数中用用户输入的大小初始化
arr
。
此外,最好将 perform()
内的 for
循环的条件设置为 j < 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
我正在尝试声明一个数组而不必提供固定的初始大小,因为我想接受用户的大小。这是我想出的最新方法。我可以在声明时给出最大可接受值,但我不想这样做,因为它对 space.
的使用不当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
只需将其声明为 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.
}
我会推荐你使用 List
而不是数组,不需要初始大小,你可以随意插入元素
List<Integer> arr = new LinkedList<Integer>();
arr.add(5);
....
//Use for loop for adding numbers
您可以使用列表来代替数组,而无需声明大小。然后您可以即时添加项目。 您的 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));
}
ArrayList 是一个更好的选择,你可以在没有固定大小的情况下进行初始化,并且它比经典数组有一些更好的属性。
ArrayList<datatype> array_name = new ArrayList<datatype>();
确定您可以通过
添加新索引array_name.add(new array index name);
从用户那里获取大小后,只需在构造函数中初始化数组即可。您当前正在用户输入任何输入之前初始化数组,此时 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];
}
按如下操作:
- 声明
arr
没有任何大小并作为实例变量。 - 在构造函数中用用户输入的大小初始化
arr
。
此外,最好将 perform()
内的 for
循环的条件设置为 j < 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