[英]defining an array size without hardcoding in Java
我遇到了一个问题,我无法在没有用Java硬编码的情况下初始化数组。
所以这是有效的硬代码版本:
int numberOfElements = inputFromFile(args[0], myArray);
int [] myArray = new int[1000];
inputFromFile基本上是一个我要编写的方法,可以从文本文件中读取numberOfElements以及我的程序。
我尝试修复它没有硬编码,并得到我的结果:
int numberOfElements = inputFromFile(args[0], myArray);
int [] myArray = new int[numberOfElements];
问题仍然是Eclipse希望我初始化myArray,它是一个整数数组。 没有硬编码有什么好的解决方案吗? 任何建议都会很棒。
而是使用ArrayList? 与C一样,Java需要不断调整大小的数组。
您需要在使用之前初始化数组。 你知道,我知道。
如果您不知道数据的大小,即:您不知道数组大小有多大,那么您将需要使用ArrayList<T>
,它在内部使用数组并管理数组大小的重新分配。
如果必须使用数组,则必须自己维护数组大小。 随着数组的增长,如果你没有为数据设置足够的空间,你可能会用尽桶:IndexOutOfBoundsException等。然后你需要创建一个新的数组副本当前数组的内容,然后继续。 所有这些都是在ArrayList中为您完成的,这是有益的。 节省您的时间和实施。 此外,还有一个称为负载因子的概念,用于扩展阵列。
数组的加载因子通常是:
(j * 3)/ 2 + 1 // j表示阵列的当前长度。
仅供参考:如果您的数据变得非常大,则复制数组会变得非常昂贵。
int numberOfElements = inputFromFile(args[0], myArray);
int [] myArray = new int[1000];
通过查看您的代码,您的语句顺序是错误的,应该是:
int [] myArray = new int[1000];
int numberOfElements = inputFromFile(args[0], myArray);
您在声明和初始化之前将myArray传递给方法。
ArrayList<Integer> s = new ArrayList<Integer>();
int numberOfElements = inputFromFile(args[0], myArray);
这会更好。 然后,您需要更改方法签名,如下所示:
public void inputFromFile(String fileName, ArrayList<Integer> collection){
// your impl.
}
使用和声明数组的各种方法: http : //leepoint.net/notes-java/data/arrays/arrays.html
当你在声明之前尝试使用myArray
,你的代码块都不会起作用,否则你会尝试重新声明myArray
。 除此之外,如果通过“硬编码”表示使用字面值,那么不,您不必这样做。 任何这些都可行:
int[] arr1 = new int[5];
int size = 10;
int[] arr2 = new int[size];
int sizeLoadedFromFile = loadSizeFrom("/foo/bar/baz");
int[] arr3 = new int[sizeLoadedFromFile];
请注意,如果您提前知道元素,也可以声明一个没有显式“size”参数的数组:
int[] arr4 = {1, 2, 3, 4};
如果你认为你想要一个数组,但是你不知道它的大小,那么你真正想要的是某种集合 -可能是一个List :
List<Integer> list1 = new ArrayList();
list1.add(1);
list1.add(2);
list1.add(3);
list1.add(4);
或者更可读的是,如果您提前了解这些元素,请再次:
List<Integer> list2 = new ArrayList() {{
add(1); add(2); add(3); add(4);
}};
要么
List<Integer> list3 = Arrays.asList(1, 2, 3, 4, 5);
收藏教程应告诉您需要了解的任何其他内容。
我认为你得到的错误是因为
1)您在声明之前使用myArray。
2)函数inputFromFile的返回类型与int不匹配。
我认为以下程序将回答您的问题。 这里我有一个int标识符'm',它被设置为'getNumber'方法返回的值。 然后我宣布一个大小为m的数组。
public class Practise {
public static void main(String args[]){
int m = getNumber();
int [] a = new int[m];
for(int i = 0; i < m; i++)
System.out.println(a[i]);
}
public static int getNumber(){
Scanner input = new Scanner(System.in);
int i = 0;
i = input.nextInt();
return i;
}
}
使用List <Integer>的替代方法是使用Trove4j TIntArrayList。 这实际上是int[]
的包装器。
但是,对于大多数用例,ArrayList <Integer>通常足够快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.