在java中填充未初始化的数组?(或解决方法!)

在java中填充未初始化的数组?(或解决方法!),java,android,opengl-es,inputstream,dynamic-memory-allocation,Java,Android,Opengl Es,Inputstream,Dynamic Memory Allocation,我目前正在为opengles android游戏创建一个OBJ导入器。我对java语言比较陌生,所以有几点我不太清楚 我有一个数组,它将保存模型中的顶点数(以及一些其他数组): 问题是,在使用提供给我的inputstream读取文件之前,我不知道模型中有多少个顶点 我能按需要填写吗 vertices[95] = 5.004f; //vertices was defined like the example above 或者我必须事先初始化它吗 如果是后者,那么找出文件中顶点数量的好方法是什么?

我目前正在为opengles android游戏创建一个OBJ导入器。我对java语言比较陌生,所以有几点我不太清楚

我有一个数组,它将保存模型中的顶点数(以及一些其他数组):

问题是,在使用提供给我的inputstream读取文件之前,我不知道模型中有多少个顶点

我能按需要填写吗

vertices[95] = 5.004f; //vertices was defined like the example above
或者我必须事先初始化它吗

如果是后者,那么找出文件中顶点数量的好方法是什么?一旦我使用inputstreamreader.read()读取它,它就会转到下一行,直到它读取整个文件为止。我唯一能想到的就是读取整个文件,计算顶点的数量,然后在新初始化的数组中再次读取填充


是否有一种方法可以根据需要动态分配数据?

您可以使用ArrayList,它将为您提供所需的动态大小

   List<Float> vertices = new ArrayList<Float>();
而且这个名单会根据你的需要而增加

需要注意的是:ArrayList将保存对象,而不是基元类型。因此,它将您提供的浮点值存储为浮点对象。但是,很容易从中获得原始浮点值

如果您绝对需要一个数组,那么在读入整个值列表后,您可以很容易地从列表中获得一个数组


您可以开始阅读Java集合。

不,您不能填写未初始化的数组。 如果您需要一个允许存储数据和索引的动态结构(在您的情况下,这似乎很重要),我会选择Map(Map的关键是您的索引):

Map顶点=新HashMap();
顶点放置(95,5.004f);

在java数组中必须事先初始化。在您的情况下,您有以下选项:

1) 按照其他人的建议,使用
ArrayList
(或
List
接口的其他实现)。这样的列表可以动态增长,因此这将有所帮助

2) 如果可以控制文件格式,请在文件开头添加有关顶点数的信息,以便可以使用正确的大小预先初始化阵列

3) 如果无法控制它,请尝试根据文件大小猜测顶点数(例如,浮点值为4字节,因此可以将
file.length()
除以4)。如果猜测的数字太小,您可以动态创建一个更大的数组(例如,前一个数组大小的120%),将前一个数组中的所有数据复制到新数组中并继续。这可能代价很高,但如果您对数组大小的猜测是准确的,那么就不会有问题

如果您向我们提供有关文件格式和/或如何使用此顶点数组的更多信息(例如:长时间存储或快速丢弃),我们可能会给您提供更多想法

   List<Float> vertices = new ArrayList<Float>();
   vertices.add(5.0F);
Map<Integer, Float> vertices = new HashMap<Integer, Float>();
vertices.put(95, 5.004f);