我需要算法来以相反的顺序读取二进制文件和带有大块的压缩数组。 例如:
Input binary data: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Chunk size: 4
Result: {13 14 15 16} {9 10 11 12} {5 6 7 8} {1 2 3 4}
有什么想法吗?
答案 0 :(得分:4)
Linq方法(由于GroupBy
和Reverse
而效率低下,但无论如何,我还是更喜欢Linq):
byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
int chunkSize = 4;
var chunkedBytes = bytes.Select((x, i) => new { Index = i, Value = x })
.GroupBy(i => i.Index / chunkSize)
.Select(i => i.Select(j => j.Value))
.Reverse().ToList();
使用老式循环:
byte[] bytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
int chunkSize = 4;
var chunkedBytes = new List<byte[]>();
int offset = bytes.Length % chunkSize;
for (int i = bytes.Length - 1; i >= 0; i -= chunkSize)
{
byte[] tempBytes = new byte[i < chunkSize - 1 ? offset : chunkSize];
int index = 0;
for (int j = tempBytes.Length - 1; j >= 0; j--)
tempBytes[index++] = bytes[i - j];
chunkedBytes.Add(tempBytes);
}
答案 1 :(得分:2)
这不是一个大问题,因为您没有表现出自己的努力。
但是正如您添加的[kotlin]
一样,这很容易用Kotlin编写:
val input = byteArrayOf( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 )
val result = input.asList().chunked(4).reversed()
(请注意,此解决方案在JVM中的内存消耗方面不是很好,但是可以通过针对字节数组优化内置的chunked
函数来解决。