我有一个文件,其中包含时间戳,坐标,坐标,空格分隔的数据,如此处所示;
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数据包,所以我不确定这是否可能在最后添加“”。
答案 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 + 1
和counter + 2
。尝试将循环条件更改为:
for (int counter = 0; counter + 2 < info.length; counter = counter+3)
答案 2 :(得分:1)
不需要外部库。
您可以调用dataHolder.trim();
,它将从开头删除任何空格并结束字符串。然后使用dataHolder.split("\s"); //splits on "whitespace"
,您将收到一个仅包含您的数据且具有适当大小的数组。
这将在每次迭代时保存所有检查,计数器+ 2是否仍在数组的范围内。虽然仍然是一个有效的解决方案,但由于其“检查 - 验证”的固有特性,这可能会在将来引入更多问题 - 您可能只是忘记处理其中一个案例 - 而事先修剪字符串使其在结构上,构造有效且无需处理特殊情况。