将数组拆分为 X 长度的片段

2022-09-03 12:34:21

目前我有一个大小为N的数组。我正在尝试从数组中复制每个 X 数量的字节。

示例,如果数组大小为 10,而我想要大小为 3 的数组。我会复制前3个元素,然后是接下来的3个元素和最后一个1。

目前我正在使用以下算法:

int I = 0;
int sub = bytes.length;
int counter = 0;
for (I = 0; I < bytes.length; ++I) {
    if (I % 3 == 0 && I != 0) {
       NewArray[counter] = Arrays.copyOfRange(bytes, I - 3, I));
        sub -= 3;
        ++counter;
    }
}

NewArray[counter] = Arrays.copyOfRange(bytes, I - sub, I)); //Copy remainder.

有没有更有效或更体面的方式来做我想做的事情?这个算法看起来很糟糕= l

任何想法,我该如何改进它,或者至少是一个提示?


答案 1

那这个呢:

int x = 3;  // chunk size
int len = bytes.length;
int counter = 0;

for (int i = 0; i < len - x + 1; i += x)
    newArray[counter++] = Arrays.copyOfRange(bytes, i, i + x);

if (len % x != 0)
    newArray[counter] = Arrays.copyOfRange(bytes, len - len % x, len);

答案 2

下面是一个将 a 转换为 数组的方便方法。因此,结果是 .byte[]byte[]byte[][]

public byte[][] splitBytes(final byte[] data, final int chunkSize)
{
  final int length = data.length;
  final byte[][] dest = new byte[(length + chunkSize - 1)/chunkSize][];
  int destIndex = 0;
  int stopIndex = 0;

  for (int startIndex = 0; startIndex + chunkSize <= length; startIndex += chunkSize)
  {
    stopIndex += chunkSize;
    dest[destIndex++] = Arrays.copyOfRange(data, startIndex, stopIndex);
  }

  if (stopIndex < length)
    dest[destIndex] = Arrays.copyOfRange(data, stopIndex, length);

  return dest;
}

与以前的最佳答案相比,一些优点:

  1. 该条件使用比 更有意义的 a。for<=< ... + 1
  2. 将止损指数放在临时字段中可减少最后一个块中的计算次数。if

(单元测试)