Как создать список разделов из списка последовательных точек - PullRequest
0 голосов
/ 18 января 2019

Эта проблема легко решается с помощью классического цикла for

for (i = 0; i < points.size() - 1; i++) {
    PointAG p1 = this.points.get(i);
    PointAG p2 = this.points.get(i + 1);
    sections.add(new LineSection(p1, p2));
}

Есть ли возможность добиться того же функционально, например, с двумя итераторами?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Вы можете сделать это с помощью одного итератора, таким образом:

Iterator<PointAG> it = points.iterator();
if (it.hasNext()) {
  PointAG prev = it.next();
  while (it.hasNext()) {
    PointAG next = it.next();
    sections.add(new LineSection(prev, next));
    prev = next;
  }
}

Вы можете написать тело цикла без каких-либо дополнительных переменных:

  while (it.hasNext()) {
    sections.add(new LineSection(prev, prev = it.next()));
  }

Используется гарантированный порядок вычисления Java слева направо, что означает, что первый prev оценивается перед повторным назначением. Это может быть не лучшим подходом: побочные эффекты внутри выражений легко пропустить при чтении кода; используйте тот, который вам удобно читать.

Выполнение этого с помощью итератора будет более эффективным, чем индексирование для реализаций списков, отличных от RandomAccess, например LinkedList.

0 голосов
/ 18 января 2019

Зависит от того, что вы подразумеваете под "функциональным способом".

Если вы имеете в виду "использование потоков", то одним из следующих способов может быть:

List<LineSection> sections = IntStream.range(1, points.size())
        .mapToObj(i -> new LineSection(this.points.get(i - 1), this.points.get(i)))
        .collect(Collectors.toList());

Но на самом деле это не короче и не проще для чтения, чем обычный цикл for, так зачем это делать?

List<LineSection> sections = new ArrayList<>();
for (int i = 1; i < points.size(); i++)
    sections.add(new LineSection(this.points.get(i - 1), this.points.get(i)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...