2011-01-30 79 views
2

我有一個文件,其形式爲時間戳,座標,座標,空格分隔的數據,Java循環每三個在一個數組中收集第二個和第三個元素

14:25:01.215 370.0 333.0

我需要遍歷和座標僅添加到陣列。來自該文件的數據被讀入並從split(「」)中放入稱爲info的String []。我有兩個問題,我認爲文件的末尾有一個額外的「」,我需要適當地丟失,並且我還想要我的循環的確認/建議,此時我會出現零星的超出界限例外。我的循環如下;

String[] info; 
info = dataHolder.split(" "); 
ArrayList<String> coOrds1 = new ArrayList<String>(); 
for (int counter = 0; counter < info.length; counter = counter+3) 
{ 
    coOrds1.add(info[counter+1]); 
    coOrds1.add(info[counter+2]); 
} 

幫助和建議表示讚賞。

該文本文件是here,但該類收到來自另一個類的UDP數據包,所以我不確定這是否可能在最後添加「」。

回答

3

有各種類別/谷歌的Guava庫方法,可以完成這個任務的幫助,特別是Splitter.omitEmptyStrings()將在文件末尾丟棄任何尾隨空格:

String input = Files.toString(file, Charsets.US_ASCII); 
Iterable<String> fields = 
    Splitter.on(" ") 
      .omitEmptyStrings() 
      .split(input); 
List<Coord> coords = Lists.newArrayList(); 
for (List<String> group: Iterables.partition(fields, 3)) { 
    String t = group.get(0); 
    double x = Double.parseDouble(group.get(1)); 
    double y = Double.parseDouble(group.get(2)); 
    coords.add(new Coord(t, x, y)); 
} 
+0

我不認爲在這種情況下需要一個外部庫,這將是過度使用/過度依賴這種庫的一個典型例子。另外,一旦發貨,它就會臃腫。 只有標準的lib,imho纔有完美的簡單和適合工作的解決方案。 – pnt 2011-01-30 15:13:33

1

如果您最後有額外空間,則會發生此問題,因爲您正在測試counter < info.length並使用counter + 1counter + 2。嘗試改變循環條件:

for (int counter = 0; counter + 2 < info.length; counter = counter+3) 
1

不需要外部庫。

您可以撥打dataHolder.trim();這將刪除從開始的任何空格,並結束您的字符串。然後使用dataHolder.split("\s"); //splits on "whitespace",您將收到一個僅包含您的數據和適當大小的數組。

這將爲您節省每次迭代時的所有檢查,無論counter + 2是否仍在數組範圍內。儘管仍然是一個有效的解決方案,但由於其「固定檢查」的固有特性,將來可能會引發更多問題 - 您可能會忘記處理其中一個案例 - 同時預先修整字符串使其在結構上,構造上有效,無需處理特殊情況。

相關問題