2011-01-30 26 views
2

私はタイムスタンプ、座標、座標、スペースで区切られた形式のデータを持つファイルをここにあります。配列内の3つおきに2番目と3番目の要素を収集するJavaループ

14:25:01.215 370.0 333.0

私をループする必要があり、唯一の配列に座標を追加します。ファイルからのデータは、split( "")からinfoというString []に読み込まれ、読み込まれます。私は2つの問題を抱えています。ファイルの最後には適切に失う必要のある余分なものがあります。また、ループの確認/提案が必要です。私のループは以下の通りです。

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

この作業を助けることができるGoogleの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

+0

@pntこの例では、そのライブラリの4つ以上のクラスから利益を得るので、このケースでは残念だとは思わない。そして膨らみには、常に[ProGuard](http://proguard.sourceforge.net/)があります。 – finnw

+0

私は、複数のクラスが図書館から利用されることに同意します。そのような機能がまだ存在していなければ、それを使用することが正当化されるだろう。私の指摘は、ライブラリが完全に省略され、std libのみを使用して問題がより少ないlocでエレガントに解決できるということでした。 – pnt

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が配列のスコープ内にあるかどうかを確認するたびに、すべてのチェックを保存します。これは有効な解決策ですが、将来的には、「チェック・チェック・チェック」という本質的な性質のため、さらに問題を引き起こす可能性があります。ストリングをトリミングして構造的に、有効であり、特殊なケースを処理する必要はありません。

関連する問題