基于另一个ArrayList

时间:2017-03-22 03:49:44

标签: java arraylist

我有三个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。

2 个答案:

答案 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你的意思是xy坐标对,那么你需要同时从ArrayList移除它们。只需找到一对xy坐标并将其删除即可。

请记住删除它们,因为您必须保留订单。

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。