2013-06-08 16 views
13

Posiada:Byte tablicy z wyściółką null bajtów na koniec: Jak skutecznie skopiować do mniejszej tablicy bajtów

[46][111][36][11][101][55][87][30][122][75][66][32][49][55][67][77][88][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0][0] 

ma:

[46][111][36][11][101][55][87][30][122][75][66][32][49][55][67][77][88] 

Mam tablicę wielkości bajtów 8192, aby rozpocząć , a zaczynając od jakiegoś indeksu w tej pierwszej tablicy, aż do końca tablicy, wszystkie bajty są zerowymi bajtami. Więc może być 6000 bajtów z wartościami i 2196 bajtów zerowych na końcu w tablicy. W jaki sposób mogę wydajnie utworzyć nową tablicę rozmiarów (6000) i skopiować te bajty? Uwaga: Nie wiem, ile będzie pustych bajtów lub bajtów z wartościami.

+1

Jakie są pozostałe bajty w swojej nowej tablicy zamiar EQU glin? To, czego szukasz, nie ma większego sensu. –

+0

Dobra stara pętla? Będzie łatwiej, jeśli nie możesz mieć zera w części danych. – Pragmateek

+0

Nowy 'bajt []' będzie miał 0 we wszystkich elementach, więc niczego nie osiągniesz, jeśli chcesz na końcu tablicy elementów 8192. – kdgregory

Odpowiedz

25

Oto moja próba:

static byte[] trim(byte[] bytes) 
{ 
    int i = bytes.length - 1; 
    while (i >= 0 && bytes[i] == 0) 
    { 
     --i; 
    } 

    return Arrays.copyOf(bytes, i + 1); 
} 

public static void main(String[] args) 
{ 
    byte[] bytes = { 0, 1, 2, 0, 3, 4, 5, 0, 6, 0, 0, 7, 8, 9, 10, 0, 0, 0, 0 }; 

    byte[] trimmed = trim(bytes); 

    return; 
} 
7

dlaczego nie spróbować statyczną kopię metoda tablicy w klasie systemu prostu dać pozycję tablicy źródłowej startową src, tablicy docelowej, pozycję początkową docelowego i długość

 System.arraycopy(src, srcPos, dest, destPos, length); 
     byte [] dest= new byte [6000]; 
     System.arraycopy(src, 0, dest, 0, 6000); 
+3

Pytający stwierdził, że nie wie, ile jest niezerowych bajtów. Takie podejście zadziałałoby tylko wtedy, gdyby wiedział wcześniej. – Octahedron

1

myślę, że możemy zrobić w ten sposób również

byte []array={0, 69, 0, 71, 0, 72}; 

byte ar[]=new String(array).replaceAll("\0", "").getBytes(); 
+0

Podoba mi się użycie łańcucha. Jest to jasne i sprawia, że ​​jest to jedna liniówka! – Aaron

Powiązane problemy