Существует много вопросов о переполнении стека о том, как удалять элементы из коллекции при ее повторении (особенно в Java). Этот вопрос имеет приличный набор вариантов, как это сделать.Однако ни одно из условий удаления, описанных в этих ответах, не является функцией отношения записи к соседним записям .В качестве примера ...
Представьте, что у меня есть список точек x, y, и я хочу сократить список так, чтобы ни одна серия из 3 или более точек не была коллинеарной.Другими словами, я хочу иметь возможность сократить список точек так, чтобы они описывали начальную / конечную точки серии отрезков, так что никакие два отрезка не являются подразделами одного большего сегмента.Например, данный набор может выглядеть как [{0,0}, {3,0}, {5,2}, {7,4}, {10,4}] , и я быхотите уменьшить его до набора [{0,0}, {3,0}, {7,4}, {10,4}] , поскольку точка {5,2} является коллинеарнойс {3,0} и {7,4}.Тест коллинеарности зависит от предыдущей и последующей точек в наборе, поэтому невозможно узнать, нужно ли удалять данную точку на основе одной этой точки, что является требованием для большинства вариантов ответа, связанного выше,как метод removeIf()
.
Мой вопрос прост: существует ли в Java способ сокращения списка таким образом за один проход набора данных?Очевидно, что я мог бы выполнить итерацию по ней один раз, проверить каждую точку на коллинеарность с соседями и сохранить индексы точек для удаления, а затем за второй проход взять только нужные точки и создать новый набор.