1

我正在尝试删除两个数组列表中的所有重复点。每个列表都是通过查找哪个国家链接到哪个国家来创建的,如果它们链接,那么它会同时在两个数组中创建一个新点。

这个想法是这样我可以循环遍历两个数组的大小(或一个数组的大小)并在点之间画线。

目前的问题是它没有删除这些点或将它们全部删除。

我有以下数组

//Different values of course.
Array1 = [Point[1,5]],[Point[1,5]],[Point[1,5]][Point[1,5]]
Array2 = [Point[1,5]],[Point[1,5]],[Point[1,5]][Point[1,5]]

这是删除重复数组的代码:

private ArrayList<ArrayList<Point>> checkDuplicatePoints(ArrayList<Point> Array1, ArrayList<Point> Array2)
{
    for(int index1 = 0; index1 < Array1.size(); index1++)
    {
        for(int index2 = 0; index2 < Array2.size(); index2++)
        {
            //So not the same position in the list.
            if(index1 != index2)
            {
                if(
                    Array1.get(index1).x == Array2.get(index2).x &&
                    Array1.get(index1).y == Array2.get(index2).y
                )
                {
                    Array1.remove(index1);
                    Array2.remove(index2);
                    checkDuplicatePoints(Array1, Array2);
                }
            }
        }
    }

    ArrayList<ArrayList<Point>> n2DPointArray = new ArrayList<ArrayList<Point>>();

    n2DPointArray.add(Array1);
    n2DPointArray.add(Array2);

    return n2DPointArray;
}
4

4 回答 4

2

据我了解,您的问题可能是您应该查看这些代码和示例

public class test {
public static void main(String ap[])
{

    List<Point> mList1 =new ArrayList<Point>();
    List<Point> mList2 =new ArrayList<Point>();
    Point mPoint1 = new Point(1, 2);
    Point mPoint2 = new Point(2, 3);

    for (int i=0;i<3;i++){
        mList1.add(mPoint1);
        mList1.add(mPoint2);
    }
    Point mPoint3 = new Point(1, 2);
    Point mPoint4 = new Point(3, 4);

    for (int i=0;i<2;i++){
        mList2.add(mPoint3);
        mList2.add(mPoint4);
    }

    System.out.println(mList1);
    //System.out.println(mList2);
    new test().removingDuplicatesQID(mList1, mList2);
    System.out.println(mList1);
}
public void removingDuplicatesQID(List<Point> list1,List <Point> list2)
{
    Set<Point> uniqueEntries = new HashSet<Point>();
    for (Iterator iter = list1.iterator(); iter.hasNext();)
    {
        Point element = (Point) iter.next();
        if (!uniqueEntries.add(element))
            /* if current element is a duplicate, remove it */
            iter.remove();
    }
    uniqueEntries.clear();
}
}

输出

    System.out.println(mList1);

[java.awt.Point[x=1,y=2], java.awt.Point[x=2,y=3], java.awt.Point[x=1,y=2], java.awt.点[x=2,y=3], java.awt.Point[x=1,y=2], java.awt.Point[x=2,y=3]]

//从arrayList1中删除重复项后

        System.out.println(mList1);

[java.awt.Point[x=1,y=2], java.awt.Point[x=2,y=3]]

我希望这可以帮助你或者..else更具体到你的问题和结果你需要从你的数组列表中

于 2012-09-25T19:25:54.900 回答
0

将它们放入Set中。集合不允许重复条目。

编辑:另一种可能性:首先不要添加它们。

void addPoint( Point newPoint )
{
    if( !array1.contains(newPoint) )
    {
        array1.add(newPoint);
    }
}

另一个编辑:

现在,更清楚了:为什么不为此创建自己的数据结构。让我们称之为CountryLink

如果它的两个实例具有相同的两个点,无论是作为开始还是结束,它将有两个Points 和覆盖,因为它返回 true。equals()然后您可以轻松地将其放入 ArrayList 中,如上所示。或者进入一个自动拒绝重复的集合。

于 2012-09-25T18:43:46.310 回答
0

我不确定,如果我理解你的问题是正确的,但这是一个制作列表的解决方案,它只包含不同的元素(它不是很有效):

private ArrayList<Point> distinctPoints(ArrayList<Point> first, ArrayList<Point> second)
{
    ArrayList<Point> distinct = new ArrayList<Point>();

    for(Point point : first)
        if(!distinct.contains(point))
            distinct.add(point);

    for(Point point : second)
        if(!distinct.contains(point))
            distinct.add(point);

    return distinct;
}

另一个用于查找重复项:

private ArrayList<Point> duplicatePoints(ArrayList<Point> first, ArrayList<Point> second)
{
    ArrayList<Point> duplicate = new ArrayList<Point>();
    ArrayList<Point> distinct = new ArrayList<Point>();

    for(Point point : first)
        if(distinct.contains(point))
            duplicate.add(point);
        else 
            distinct.add(point)   

    for(Point point : second)
        if(distinct.contains(point))
            duplicate.add(point);
        else 
            distinct.add(point)  

    return duplicate;
}

如果您没有为此使用java.awt.Point该类,那么您的 Point 类应该有一个覆盖equals()并且看起来像这样:

public class Point
{
    public int x;
    public int y;

    public Point(int x, int y) {this.x=x; this.y=y;}
    public Point(){this(0,0);}

    @Override
    public boolean equals(Object obj)
    {
        if(obj == null) return false;
        if(obj == this) return true;
        if(obj.getClass() != Point.class) return false;
        Point other = (Point) obj;
        return other.x==this.x && other.y==this.y;
    }
}
于 2012-09-25T18:44:57.443 回答
0

我不认为我遵循您的想法,但为什么不使用迭代器?

例如:

for (Iterator iter = yourList.iterator(); iter.hasNext(); )
 {
    Object item = iter.next();

    if (YOUR_CONDITION_HERE)
    {
        iter.remove();
    }
}
于 2012-09-25T18:47:09.017 回答