我有三个arraylists。两个保持画布上的点的坐标(xCoord,yCoord)。这是一个点对点程序。第三个arraylist持有代码来计算哪些点可以从画布中移除,并且具有最低的"伤害"或者对结果图片进行破坏。这是基于一个简单的算法,它返回一个"临界值"。具有较小临界值的点比具有较高临界值的点小得多。
我的问题是根据最小的临界值从x和y arraylists中删除n个点。我已经实现了用户输入的代码。
public void removeDots(int numberDesired){
int i = 0;
for (i =0; i<numberDesired; i++){
xCoord.remove(critDots.get(i); //No idea, just trying random things.
yCoord.remove(critDots.get(i);
}
}
for (i = 0; i < xCoord.size()-1; i++) {
critValue = Algorithm Calculations
critDots.add(critValue);
}
我想过使用
Collections.sort(critDots)
从最不重要到最关键的组织,但我不确定这将如何影响我的xCoord / yCoord的顺序。
一些提示可以帮助我找到正确的方向,我们将不胜感激。 此外,xCoord,yCoord和critDots都是arraylists。
答案 0 :(得分:0)
将x和y值放在单独的Dot
类中:
class Dot {
private final int x;
private final int y;
// hashValue and equals methods
}
将画布上的点列表存储在列表中:
List<Dot> dots;
对于您而言,这可能比将x和y坐标存储在单独的列表中更好。它也是更好的OO设计,因为它允许您添加属性到点(例如颜色),而无需更改模型。
使用“伤害”算法来获得造成最小伤害的点:
List<Dot> toRemove = dots.stream()
.sort(comparingInt(d -> calculateDamageForDot(d)))
.limit(numberToRemove)
.collect(toList());
如果你不熟悉溪流,那么请在评论中告诉我,我将提供一个老式的迭代来做同样的事情。
然后,最后,删除损坏最小的点:
dots.removeAll(toRemove);
答案 1 :(得分:0)
正如你所说,dot
你的意思是x
和y
坐标对,那么你需要同时从ArrayList
移除它们。只需找到一对x
和y
坐标并将其删除即可。
请记住删除它们,因为您必须保留订单。
public void removeDots(int x, int y){
//find that pair
for(i=0; i<xCoord.size(); i++) {
if(xCoord.get(i) == x && yCoord.get(i) == y) {
xCoord.remove(i);
yCoord.remove(i);
break; //don't remove this break if there are duplicate co-ordinates in your lists.
}
}
}
现在只需调用上面的方法并删除它们:
...
removeDots(3, 5);
...
但是,为您的&#34;点&#34;创建自定义数据类型会更好。而不是像这样管理两个arraylists。