Цикл Java для сбора второго и третьего элементов каждые три в массиве - PullRequest
2 голосов
/ 30 января 2011

У меня есть файл с данными в виде отметки времени, координаты, координаты, разделенные пробелами, как здесь;

14: 25: 01,215 370,0 333,0

Мне нужно перебрать и добавить координаты только в массив. Данные из файла считываются и помещаются как String [], называемый info, из 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]);
}

Помощь и предложения приветствуются.

Текстовый файл здесь , но класс получает UDP-пакет от другого класса, поэтому я не уверен, может ли это добавить "" в конце или нет.

Ответы [ 3 ]

3 голосов
/ 30 января 2011

Существуют различные классы / методы в библиотеке Google Guava , которые могли бы помочь с этой задачей, в частности <a href="http://guava-libraries.googlecode.com/svn/tags/release08/javadoc/com/google/common/base/Splitter.html#omitEmptyStrings%28%29" rel="nofollow">Splitter.omitEmptyStrings()</a>, которая отбрасывает любые конечные пробелы в конце файла:

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 голос
/ 30 января 2011

Нет необходимости во внешних библиотеках.

Вы можете просто позвонить dataHolder.trim();, который удалит все пробелы в начале и конце вашей строки.Затем, используя dataHolder.split("\s"); //splits on "whitespace", вы получите массив, состоящий только из ваших данных и соответствующего размера.

Это сэкономит вам все проверки на каждой итерации, находится ли счетчик + 2 в области действия массива.Хотя это и остается действительным решением, это может привести к возникновению дальнейших проблем в будущем из-за присущей ему природы «проверки для проверки» - вы просто можете забыть обработать один из случаев - в то время как предварительная обрезка строки делает ее структурно построенной, построеннойдействителен и нет необходимости обрабатывать особые случаи.

1 голос
/ 30 января 2011

Проблема возникнет, если у вас будет дополнительный пробел в конце, потому что вы тестируете counter < info.length и используете counter + 1 и counter + 2. Попробуйте изменить условия цикла на:

for (int counter = 0; counter + 2 < info.length; counter = counter+3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...