2

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

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

float vertices[];

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

我可以根据需要填写吗?:

vertices[95] = 5.004f; //vertices was defined like the example above

还是我必须事先初始化它?

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

有没有办法根据需要动态分配数据?

4

3 回答 3

6

您可以使用 ArrayList 来获得所需的动态大小。

   List<Float> vertices = new ArrayList<Float>();

您可以添加这样的值:

   vertices.add(5.0F);

并且该列表将根据您的需要而增长。

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

如果您绝对需要一个数组,那么在读入整个值列表后,您可以轻松地从列表中获取一个数组。

您可以在此处开始阅读有关 Java 集合的信息。

于 2010-12-29T01:57:24.597 回答
1

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

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

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

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

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

于 2010-12-29T02:09:11.007 回答
0

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

Map<Integer, Float> vertices = new HashMap<Integer, Float>();
vertices.put(95, 5.004f);
于 2010-12-29T02:02:34.463 回答