2015-07-25 2 views
4

Мне нужно добавить (переменное количество) массивов байтов. Коллекции, похоже, работают только с классами-оболочками, то есть с байтом. Примерно через 20 часов я придумал это, и она работает, но я подумал, что это может быть улучшено (ADD TO LIST, но любые другие предложения по улучшению приветствуются :), т.е.Могу ли я использовать метод addAll Collection для добавления всех элементов (типа: byte) из массивов (byte []) в список типа Byte?

метод 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; 
} 
+0

Следует переместить в обзор кода? – MCMastery

ответ

4

Вы можете придерживаться ваших массивов и избежать бокс/распаковка в байте с чем-то вроде этого:

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; 
} 
+1

Правильно! Гораздо быстрее и оптимально использовать память, чем использование коллекций. –

0

Вот один изменение

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; 
} 
Смежные вопросы