【问题标题】:Java loop to collect the second and third elements every three in an arrayJava循环收集数组中每三个元素的第二个和第三个元素
【发布时间】:2011-06-18 03:06:10
【问题描述】:

我有一个文件,其数据格式为时间戳、坐标、坐标,以空格分隔,如下所示;

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 数据包,所以我不确定这是否可能在末尾添加“”。

【问题讨论】:

    标签: java loops arraylist


    【解决方案1】:

    如果最后有多余的空格,就会出现问题,因为您正在测试counter &lt; info.length 并使用counter + 1counter + 2。尝试将循环条件更改为:

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

    【讨论】:

      【解决方案2】:

      Google 的 Guava 库中有多种类/方法可以帮助完成这项任务,尤其是 @987654322@,它将丢弃文件末尾的任何尾随空格:

      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));
      }
      

      【讨论】:

      • 我认为在这种情况下不需要外部库,这将是过度使用/过度依赖此类库的经典示例。另外,一旦发货,它会使可分发的内容膨胀。仅使用标准库恕我直言,有非常简单且适合工作的解决方案。
      • @pnt,我认为在这种情况下并不过分,因为该示例受益于该库中不少于四个类。至于对抗膨胀,总是有ProGuard
      • 我同意图书馆将使用不止一个类。如果此类功能尚不存在,则使用它是合理的。我的观点是,可以完全省略该库,并且仅使用 std 库就可以用更少的 loc 优雅地解决问题。
      【解决方案3】:

      不需要外部库。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-11
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多