在点的arraylist中找到重复的点

时间:2012-09-25 18:35:35

标签: java android

我正在尝试删除两个数组列表中的所有重复点。每个列表都是通过查找指向哪个国家/地区的国家/地区链接创建的,如果它们链接,则会同时在两个阵列中创建新点。

我的想法是,我可以循环两个数组的大小(或大小为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 个答案:

答案 0 :(得分: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.Point [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]]

我希望这可以帮助您或者..更具体地解决您的问题,并从阵列列表中获得结果

答案 1 :(得分:0)

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

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

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

另一个编辑:

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

它将有两个Point和覆盖equals(),因为它返回true,如果它的两个实例具有相同的两个点,无论是作为开始还是结束。然后你可以很容易地把它放到如上所示的ArrayList中。或者进入一个自动拒绝重复的Set。

答案 2 :(得分: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;
    }
}

答案 3 :(得分:0)

我认为我不遵循你的想法,但为什么不使用Iterator?

例如:

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

    if (YOUR_CONDITION_HERE)
    {
        iter.remove();
    }
}