簡體   English   中英

字節數組中的整數列表

[英]List of Integers into byte array

我有一個較大的LinkedList <Integer> (3912984或更大),我想將這些元素復制到字節數組中。 整數是0或1,所以我不需要更改數組的大小,我只想一一復制元素,確切地說是如何復制。 當然,我知道最簡單的方法是:

 for(int i = 0; i < list.size(); i++)      
 array[i] = (byte)(int) list.get(i);

但是這種方法太慢了,我的程序不會在幾個小時前結束! 您是否可以知道另一種方式(更快,如.NET的Buffer.BlockCopy()之類),或者我必須更改數據結構?

Number類中提供了byteValue()方法。 數字以整數,雙精度,浮點等擴展。

List<Integer> list = getNumbers();

Iterator<Integer> iterator = list.iterator();

while(iterator.hasNext())
{
   Integer i = iterator.next()
   byteArray[index] = i.byteValue();
}

您也可以使用java.nio.MappedByteBuffer類進行塊復制。 參見http://docs.oracle.com/javase/7/docs/api/java/nio/MappedByteBuffer.html

MappedByteBuffer等效於.NET中的Buffer.BlockCopy()

使用Java 8的另一種方法:

List<Integer> enteros = Stream.of(1, 2, 3, 4, 5).collect(Collectors.toList());
Byte[] bytes = enteros.stream().map(entero -> entero.byteValue()).toArray(Byte[]::new);

這是另一個測試轉換時間的復雜示例:

List<Integer> enteros = new LinkedList<>();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");

System.out.println("Init list: " + LocalTime.now().format(formatter));
// Fill array with 0 and 1
for(int i = 0; i < 9999999; i++) enteros.add(ThreadLocalRandom.current().nextInt(0, 2));
System.out.println("List complete: " + LocalTime.now().format(formatter));

System.out.println("Init list convert: " + LocalTime.now().format(formatter));
Byte[] bytes = enteros.stream().map(entero -> entero.byteValue()).toArray(Byte[]::new);
System.out.println("End convert! " + LocalTime.now().format(formatter));
// example input list
List<Integer> list = new LinkedList<Integer>();
list.add(1);
list.add(0);
list.add(1);
list.add(0);
list.add(1);
list.add(1);

// write to byte array
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos);
for (int element : list) {
    out.writeUTF(Integer.toString(element));
}
byte[] bytes = baos.toByteArray();

// read from byte array
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
DataInputStream in = new DataInputStream(bais);
while (in.available() > 0) {
    String element = in.readUTF();
    System.out.println(element);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM