1

2 つの配列リスト内のすべての重複ポイントを削除しようとしています。各リストは、どの国がどの国にリンクしているかを見つけることによって作成されます。リンクすると、両方の配列に同時に新しいポイントが作成されます。

アイデアは、両方の配列のサイズ (または 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. 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]]

これがあなたまたは..elseがあなたの問題をより具体的にし、配列リストから必要な結果を得るのに役立つことを願っています

于 2012-09-25T19:25:54.900 に答える
0

それらをセットに入れます。セットは重複したエントリを許可しません。

編集:別の可能性:そもそもそれらを追加しないでください。

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

まだ別の編集:

これで、より明確になります。このために独自のデータ構造を作成してみませんか。それを呼びましょうCountryLink

2つのインスタンスが同じ2つのポイントを持っている場合、開始か終了かに関係なく、trueを返すという点で2つPointのsとオーバーライドがあります。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;
}

そして、重複を見つけるためのもう1つ:

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 に答える