在Java中定义没有硬编码的数组大小

时间:2011-10-07 01:39:07

标签: java arrays size element

我遇到了一个问题,我无法在没有用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,它是一个整数数组。没有硬编码有什么好的解决方案吗?任何建议都会很棒。

7 个答案:

答案 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)

使用和声明数组的各种方法:http://leepoint.net/notes-java/data/arrays/arrays.html

答案 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)

  1. 您可以将数组的大小作为命令行参数提供。
  2. 使用Spring的依赖注入也是一个很好的方法,我希望你知道如何编写一个简单的bean(构造函数注入/ setter注入)。

答案 6 :(得分:0)

使用List&lt; Integer&gt;的替代方法是使用Trove4j TIntArrayList。这实际上是int[]的包装器。

然而,ArrayList&lt; Integer&gt;通常对于大多数用例来说足够快。