gpt4 book ai didi

java - 根据与先前和后续项目的关系进行迭代时从列表中删除项目

转载 作者:行者123 更新时间:2023-12-02 09:30:22 24 4
gpt4 key购买 nike

Stack Overflow 上有很多关于如何在迭代集合时从集合中删除项目的问题(特别是在 Java 中)。 This问题有一组不错的选项来说明如何做到这一点。然而,这些答案中描述的删除条件都不是条目与其相邻条目的关系的函数。举个例子...

假设我有一个 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 中是否存在一种在数据集的一次传递中以这种方式减少列表的方法?显然,我可以迭代它一次,测试每个点与其邻居的共线性,并存储要删除的点的索引,然后在第二遍中仅获取所需的点并构建一个新的集合。

最佳答案

正如评论中提到的,您可以使用removeIf/streams。

如果您在迭代时尝试删除某个项目,foreach/iterator 会给出 ConcurrentModificationException 异常,但标准的 for 循环应该可以工作。为您遍历的项目数维护一个单独的计数器(与索引分开)。下面是一个应该适用于您概述的初始示例问题的示例:

        ArrayList<R4NPoint> arrList = new ArrayList<R4NPoint>() {{
add(new R4NPoint(0, 0));
add(new R4NPoint(3, 0));
add(new R4NPoint(5, 2));
add(new R4NPoint(7, 4));
add(new R4NPoint(9, 6));
add(new R4NPoint(5, 0));
add(new R4NPoint(10, 4));
add(new R4NPoint(15, 8));
}};

// start at the second item as our check is always dependent on our previous and next neighbors
int index = 1;
int totalSize = arrList.size();
for (int numberOfItemsChecked = 1; numberOfItemsChecked < totalSize - 1; numberOfItemsChecked++) {
int prevIndex = index - 1;
int nextIndex = index + 1;
// check previous and next for removal condition
if (arrList.get(index).arePointsColinear(arrList.get(prevIndex), arrList.get(nextIndex))) {
// if they are co-linear remove the item at our current index, and don't increment the index
// the next item will now be at the current index
arrList.remove(index);
} else {
index++;
}
}
System.out.println("finalArrayAfterRemoval = " + arrList.toString());

这将导致输出:

finalArrayAfterRemoval = [{0, 0}, {3, 0}, {9, 6}, {5, 0}, {15, 8}]

我已经放弃了 R4NPoint 的实现,因为我假设您已经有一些对您有影响的东西。

关于java - 根据与先前和后续项目的关系进行迭代时从列表中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58034972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com