Java循环在数组中每三个收集第二个和第三个元素

时间:2011-01-30 14:53:08

标签: java loops arraylist

我有一个文件,其中包含时间戳,坐标,坐标,空格分隔的数据,如此处所示;

14:25:01.215 370.0 333.0

我需要循环并仅将坐标添加到数组中。读取文件中的数据并将其作为String []从split(“”)中调用。我有两个问题,我认为文件的末尾有一个额外的“”,我需要适当地丢失,我也想要我的循环的确认/建议,此刻我正在零星的超出范围的例外。我的循环如下;

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 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:1)

如果您在末尾有额外的空格,则会出现此问题,因为您正在测试counter < info.length并使用counter + 1counter + 2。尝试将循环条件更改为:

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

答案 2 :(得分:1)

不需要外部库。

您可以调用dataHolder.trim();,它将从开头删除任何空格并结束字符串。然后使用dataHolder.split("\s"); //splits on "whitespace",您将收到一个仅包含您的数据且具有适当大小的数组。

这将在每次迭代时保存所有检查,计数器+ 2是否仍在数组的范围内。虽然仍然是一个有效的解决方案,但由于其“检查 - 验证”的固有特性,这可能会在将来引入更多问题 - 您可能只是忘记处理其中一个案例 - 而事先修剪字符串使其在结构上,构造有效且无需处理特殊情况。