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;
}

編集:これは1つのオブジェクトに対して達成されます。多くを操作したい場合は、おそらく次のような静的メソッドもあります。

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または aを使用float[]して、最初に Float オブジェクトを作成する必要をなくすことができます。

于 2012-08-08T17:25:46.520 に答える
0

いいえ。

コレクションにはtoArray()メソッドがありますが、。の配列を返しVertexJavaます。

Javaには直接のメモリ操作はありません。これは、JavaのGood Things(TM)の1つです。

于 2012-08-08T17:26:48.947 に答える
0

はい。リストの .toArray メソッドを使用する

于 2012-08-08T17:25:10.560 に答える
0

短い答えはノーです。List に格納されているすべての float (またはすべてのオブジェクト) を配列に抽出する最も簡単な方法は、List.toArray() メソッドを使用することです。

List インターフェイスの JavaDocを参照してください。

于 2012-08-08T17:28:32.393 に答える