gpt4 book ai didi

java - 从字节数组创建列表

转载 作者:行者123 更新时间:2023-12-02 00:02:44 25 4
gpt4 key购买 nike

我正在移植一些 Objective C 代码。

我需要创建一个对象列表(我将使用任何类型的列表,无论什么类型)。该类如下所示:

class Foo{
double fooValue1;
double fooValue2;
double fooValue3;
double fooValue4;
}

我正在将二进制文件读入字节数组,效果很好。字节数组是一个列表4 double 。因此,如果文件中有 100 个 Foo 实例,则字节数组有 3200 个字节。即 4 * 8 * 100。

在 Objective C 中,变量被声明为指向 Foo 类型数组的指针。通过简单地复制字节来加载该数组非常快。执行此操作的语句是:

[byteArray getBytes:fooData range:range]

其中 range 是一个 NSRange 实例,其 location=0 且 length=字节数组的长度,byteArray 是从文件读取的原始 byte[],fooData 是指向目标数组的指针。

目前,我正在循环遍历字节数组,为每 32 个字节创建一个新的 Foo 实例,然后通过将每 8 个字节转换为 double 来分配字段。对于数千个对象来说,这很慢。

我的目标是 API 8,因此 Arrays.copyOf 对我来说不可用,但如果它提供了一个好的解决方案,我会考虑更改目标。

问题是;有没有办法以与 Objective C 类似的“一个语句”方式创建列表?

谢谢

[编辑]这是我根据彼得的回答使用的最终代码。我应该补充一点,该文件实际上包含一个列表列表,用标题分隔。解析文件的结果是一个字节数组的数组。

ArrayList<SCGisPointData> pointData = new ArrayList<SCGisPointData>();
SCGisPointData thisPointdata;

for (byte[] ring : linearRings) {

DoubleBuffer buffer = ByteBuffer.wrap(ring).order(ByteOrder.nativeOrder()).asDoubleBuffer().asReadOnlyBuffer();

thisPointdata= new SCGisPointData ();

while (buffer.hasRemaining()) {
thisPointdata = new SCGisPointData();
thisPointdata.longitude = buffer.get();
thisPointdata.latitude = buffer.get();
thisPointdata.sinLatitude = buffer.get();
thisPointdata.cosLatitude = buffer.get();
pointData.add(thisPointdata);
}

}

最佳答案

纯 Java 中没有办法神奇地假设一种类型可以转变为另一种类型。顺便说一句,你可以在 HotSpot 中使用 Unsafe 来做到这一点,但我不相信你可以在 Android 中使用它,这也许是最好的。

您可以通过使用具有 native 字节排序的直接 ByteBuffer 来加快转换速度。这最大限度地减少了开销,但在 Android 中不如在 HotSpot 中那么快(因为后者可以将这些方法转换为内部方法)

我会计算这需要多长时间作为估计

// or use a MappedByteBuffer from a file
ByteBuffer bb = ByteBuffer.allocateDirect(3200).order(ByteOrder.nativeOrder());
while(bb.remaining() > 0) {
float f= bb.getFloat();
}

注意:这不会运行足够长的时间,甚至无法 JIT 到 native 代码。

ByteBuffer bb = ByteBuffer.allocateDirect(3200).order(ByteOrder.nativeOrder());
for (int i = 0; i < 12; i++) {
long start = System.nanoTime();
bb.clear(); // simulate we have 3200 bytes to read.
int count = 0;
while (bb.remaining() > 0) {
float f = bb.getFloat();
count++;
}
long time = System.nanoTime() - start;
System.out.printf("Took %,d micro-seconds to read %,d float values%n", time / 1000, count);
}

在 HotSpot Java 7 上打印

Took 960 micro-seconds to read 800 float values
Took 141 micro-seconds to read 800 float values
Took 99 micro-seconds to read 800 float values
Took 101 micro-seconds to read 800 float values
Took 100 micro-seconds to read 800 float values
Took 102 micro-seconds to read 800 float values
Took 115 micro-seconds to read 800 float values
Took 127 micro-seconds to read 800 float values
Took 108 micro-seconds to read 800 float values
Took 79 micro-seconds to read 800 float values
Took 78 micro-seconds to read 800 float values
Took 79 micro-seconds to read 800 float values

关于java - 从字节数组创建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14486014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com