问题描述
我必须附加(可变数量)字节数组。 集合似乎只适用于包装类,即Byte。 大约20个小时后,我想出了这个,它有效,但我想知道它是否可以改进(添加到列表,但任何其他改进建议欢迎:),即
Collections.addAll方法将所有数组元素放到指定的集合中。 这就是调用Collections.addAll方法的方法。 它与Arrays.asList方法的作用相同但是它比它快得多,因此这是将数组转换为ArrayList的最佳方法。
这是它目前的测试版
public static byte[] joinArrays(byte[]... args) {
List<Byte> arrayList = new ArrayList();
for (byte[] arg : args) { // For all array arguments...
for (int i = 0; i < arg.length; i++) { // For all elements in array
arrayList.add(Byte.valueOf(arg[i])); // ADD TO LIST
}
}
byte[] returnArray = new byte[arrayList.size()];
for (int i = 0; i < arrayList.size(); i++) {
returnArray[i] = arrayList.get(i).byteValue(); //Get byte from Byte List
}
return returnArray;
}
1楼
你可以坚持你的阵列,避免拳击/拆箱到Byte这样的事情:
public static byte[] joinArrays(byte[]... args) {
int byteCount = 0;
for (byte[] arg : args) { // For all array arguments...
byteCount += arg.length;
}
byte[] returnArray = new byte[byteCount];
int offset = 0;
for (byte[] arg : args) { // For all array arguments...
System.arraycopy(arg, 0, returnArray, offset, arg.length);
offset += arg.length;
}
return returnArray;
}
2楼
这是一个变种
public static byte[] joinArrays(byte[]... args) {
byte[] result = null;
if(args.length > 0) {
result = args[0];
for(int index = 1; index < args.length; index++){
result = concat(result, args[index]);
}
}
return result;
}
public static byte[] concat(byte[] a, byte[] b) {
int aLen = a.length;
int bLen = b.length;
byte[] c= new byte[aLen+bLen];
System.arraycopy(a, 0, c, 0, aLen);
System.arraycopy(b, 0, c, aLen, bLen);
return c;
}