我遇到了一个问题,我无法在没有用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,它是一个整数数组。没有硬编码有什么好的解决方案吗?任何建议都会很棒。
答案 0 :(得分:2)
使用ArrayList代替? Java与C一样,需要不断调整大小的数组。
答案 1 :(得分:0)
您需要在使用之前初始化数组。你知道这一点,我认为。
如果您不知道数据的大小,即:您不知道数组大小有多大,那么您将需要使用内部使用数组的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.
}
答案 2 :(得分:0)
答案 3 :(得分:0)
当您尝试在声明之前使用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};
如果你认为你想要一个阵列,但是你不知道它的大小,那么你真正想要的是某种Collection - 可能是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);
Collections Tutorial应该告诉你任何你需要知道的事情。
答案 4 :(得分:0)
我认为您收到错误是因为
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;
}
}
答案 5 :(得分:0)
答案 6 :(得分:0)
使用List&lt; Integer&gt;的替代方法是使用Trove4j TIntArrayList。这实际上是int[]
的包装器。
然而,ArrayList&lt; Integer&gt;通常对于大多数用例来说足够快。