2014-04-16 75 views
0

我使用Java進行地圖縮減編程。ByteArray - 字符串比較,不使用bytearray.tostring()

我有一個字節數組,其中有10 MB數據。我想比較每個字節以查看它是否是空格,我的基本目的是通過使用空格分隔單詞(這是我的想法,歡迎任何其他建議)來獲取該字節數組中的每個單詞。我可以肯定地使用字符串,即首先將整個字節數組轉換爲字符串,然後比較然後做一個子字符串來獲取每個字,但是這會複製數據。我不想要任何創建像StringBuilder,StringTokenizer,substring一樣重複的東西。

我想要bytearray中的每個單詞,但沒有任何重複,因爲我正在做內存計算和重複使我耗盡資源。任何建議/想法如何進行將被諷刺。

+0

如果我正確地得到了你,你可以讀取字節的文件字節並將其與空格對應的ASCII碼進行比較。 – mok

+0

你不能那樣做。您不確定該字節數組代表什麼字符。它確實發生在_some_編碼中有一個1-1字節的<->字符數字映射的空間字符,但是你想要依賴於? – fge

+0

所以很可能,我可以檢查正在使用什麼編碼,並基於我可以使用字符通過字符ASCII代碼比較...正在瀏覽如何做到這一點...我想我可以嘗試有一個函數如byteArray.getCharAt(pos),它檢查charAt位置是否爲空間的ASCII碼 – drk

回答

0

如果你只是想避免造成整個陣列的String(和詞串都行),你可以做

HashSet<String> words = new HashSet<String>(); 
int pos = 0; 
int len = byteArray.length; 
for (int i = 0; i <= len; i++) { 
    if (i == len || byteArray[i] == ' ') { 
    if (i > pos + 1) { 
     String word = new String(byteArray, pos, i - pos, "UTF-8"); 
     words.add(word); 
    } 
    pos = i + 1; 
    } 
} 

附:您的評論似乎表明您從文件中讀取字節數組。爲什麼不避免這種情況,並直接從文件中讀取文字?如果你可以使用一個換行符(\ n)作爲分隔符(而不是空間),你可能只是做這樣的事情:

HashSet<String> words = new HashSet<String>(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(args), "UTF-8")); 
while (true) { 
    String word = reader.readLine(); 
    if (word == null) { 
    break; 
    } 
    words.add(word); 
} 
reader.close(); 
+1

不錯的解釋,謝謝,但我不使用readLine(),因爲我有另一個想法使用並行編程..謝謝反正:) – drk