1

在 C++ 中,如果我有一个带有 3 个浮点数的结构:

 struct Vertex  
  {  
    float x;  
    float y;  
    float z;  
  }

如果我有这些 ( std::vector<Vertex>) 的列表,我可以使用 memcpy 将它们复制到 float[] 中,如下所示:

float [] vertexBuffer = new float[m_vertices.size() * 3];  
memcpy(m_vertexBuffer, m_vertices.data(), m_vertices.size() * sizeof(Vertex));

有什么等价的方法可以让我在 Java 中做同样的事情吗?如果我有一个带有 x、y、z 浮点数的 Java 类 VertexJava,并且这些都存储在一个 ArrayList 中,那么我有什么方法可以将它们的所有值复制到一个 float[] 中而无需遍历列表?

4

5 回答 5

3

我认为 java 方法是在 Vertex 类中定义一个方法,该方法将返回一个浮点数组。有什么不能满足你的需要吗?

public float[] toFloatArray() {
    float[] ret = {this.x, this.y, this.z};
    return ret;
}

编辑:这为一个对象完成。如果你想操作很多,也许你也有这样的静态方法:

public static float[] manyToOneArray(List<Vector> theList) {
    float[] ret = new float[theList.size() * 3];
    int i = 0;
    for (Vector v : theList) {
        ret[i++] = v.x;
        ret[i++] = v.y;
        ret[i++] = v.z;  
    } 
    return ret;
}

ArrayUtils.addAll()我对此进行了一些更改,因为我对使用这么多次不太满意。我认为它可能会带来非常低效的性能。所以,你的问题的答案是你不能以同样的方式操纵记忆,不。您可以完成大致相同的事情,但不能达到相同的控制水平。

于 2012-08-08T17:26:11.790 回答
1

例如,您的收藏List<Float>没有float原语,它有Float对象,所以您不能。

也许您可以从一开始就使用 aTFloatArrayList或 afloat[]来避免首先创建 Float 对象。

于 2012-08-08T17:25:46.520 回答
0

是的。使用列表的 .toArray 方法

于 2012-08-08T17:25:10.560 回答
0

不。

Collections 有一个 toArray() 方法,但它会返回一个VertexJava.

Java 中没有直接的内存操作;它是 Java 的 Good Things(TM) 之一。

于 2012-08-08T17:26:48.947 回答
0

最简洁的答案是不。将所有浮点数(或更确切地说是所有对象)存储在 List 中以提取到数组中的最简单方法是使用 List.toArray() 方法。

请参考List接口JavaDoc

于 2012-08-08T17:28:32.393 回答