0

一連のポイント配列から一意のポイントを見つけたい(つまり、すべての重複を削除して、残っているものを確認したい)。

これが私が試したコードです:

int numCount = 0;
    for (int x = 0; x < ALLARRAYS.length; x++) {
        for (final Point test : ALLARRAYS[x]) {
            NUMBER: for (final Point[] numbers : ALLARRAYS) {
                if (numbers == ALLARRAYS[x]) {
                    continue;
                }
                for (int i = 0; i < numbers.length; i++) {
                    if (test.equals(numbers[i])) {
                        break NUMBER;
                    } else {
                        if (i == numbers.length - 1) {
                            numCount++;
                        }
                    }
                }
            }
            if (numCount == 10) {
                System.out.println(x + "\tPoint: " + test.x + ", " + test.y + " is unique.");
            }
            numCount = 0;
        }
        System.out.println();
    }

基本的に、チェックしたい配列が11個あるため、numCountは確認する10個の配列をチェックします。私のアプローチは、各配列を循環し、次にその配列のすべてのポイントを循環し、次に他のすべての配列の各点を循環することでした。重複が見つかった場合は、整数を完全にスキップします。

私の問題:私は誤った測定値を取得しています。何が起こっているのかわかりませんが、プログラムは他の配列にすでに存在するポイントを吐き出します。

私の目標:各アレイは全体として機能します。1つの要素が満たされない場合、配列全体がスキップされます。私の最終結果は、メソッドが各セットの要素をチェックしてそれらがすべて一意であると判断できるように、すべて一意である11個の小さいサイズの配列になるはずです。

注:アレイはすべてユニークで、途方もなく巨大です。このミニプログラムを作成して重複を排除することにより、それを切り捨てる方法を探しています。

私の質問:誰かが私を助けてくれませんか?

4

3 に答える 3

2

すべての配列エントリをセットに入れると、重複がスキップされます。

Set インターフェイスの実装で使用されるため、 Point クラスの equals メソッドを正しくオーバーライドするようにしてください。

HTH

于 2012-05-04T23:36:57.460 に答える
1

コードは、探している が表示される配列を含む、問題のすべての配列をチェックするように見えます。そのため、コードは探している を常に見つけてしまい、最終的には結果が得られません。PointPointPoint

次のようなことをする必要があるかもしれません:

        NUMBER: for (final Point[] numbers : ALLARRAYS) {
            if (numbers == array) {
                continue; // skip the array that contains 'test'
            }
            ...
        }

そうすれば、test要素を含む配列をスキップできます。

于 2012-05-04T23:44:54.143 に答える
0

配列はあなたの仕事にはあまり適していません。Intersection や removeAll などのメソッドがないだけでなく、特にサイズを小さくしたい場合は変更が困難です。

この面倒を避けるために、removedx と y を -1 に設定して Point をマークします。もちろん、1 つの座標で十分ですが、対称性の理由から ...

import java.util.*;
import java.awt.Point;

public class RandPoints
{
    Random r = new Random ();
    Point [][] arr;

    public void removeDuplicatesFrom2 (Point [] pa, Point [] pb) {
        for (Point p : pb) {
            if (p.x != - 1 && Arrays.asList (pa).contains (p)) {
                // System.out.println ("dup: " + p.x + " " + p.y);
                p.x = -1;
                p.y = -1;
            }
        }
    }

    // create a random point in range (0..19)(0..19)
    public Point randpoint () {
        return new Point (r.nextInt (20), r.nextInt (20));
    }

    // create 10 (default) arrays of size 100 (default)
    public void init (int arrsize, int arrcount) 
    {
        arr = new Point [arrcount][];
        for (int c = 0; c < arrcount; ++c)
        {
            Point [] points = new Point [arrsize];
            for (int s = 0; s < arrsize; ++s)
            {
                Point p = randpoint ();
                points[s] = p; 
            }
            arr[c] = points;
        }
    }

    public void unify () 
    {
        for (Point[] pac0 : arr) {
            for (Point[] pac1 : arr) 
            {
                if (pac0 != pac1)
                removeDuplicatesFrom2 (pac0, pac1);     
            }   
        }
    }

    /**
        fill arrays with duplicates by random, 
        show, delete and show again.
    */
    public RandPoints (int arrsize, int arrcount)
    {
        init (arrsize, arrcount);
        show ();
        unify (); 
        System.out.println ();
        show ();
    }

    public static void main (String args[])
    {
        int arrsize = 100;
        int arrcount = 10;
        if (args.length == 2)
        {
            arrsize = Integer.parseInt (args[0]);
            arrcount = Integer.parseInt (args[1]);
        }
        new RandPoints (arrsize, arrcount);
    }

    // visible feedback is always welcome while debugging/testing
    public void show ()
    {
        for (Point[] pa: arr) {
            for (Point point: pa)
                if (point.x != -1 && point.y != -1)
                    System.out.print (point.x + ", " + point.y + "\t");
            System.out.println ();
        }
    }
}

値の最大範囲 (20) も構成可能にするために、コードを少し変更しました。

で始める

java RandPoints 16 10 10
3, 0    9, 0    6, 9    2, 3    6, 9    7, 4    9, 9    2, 5    8, 7    3, 3    9, 5    3, 7    0, 5    7, 6    0, 4    8, 1    
6, 1    2, 7    2, 5    6, 7    0, 7    5, 8    4, 2    1, 9    8, 4    5, 7    0, 2    3, 1    1, 9    2, 1    8, 0    1, 7    
5, 4    9, 7    9, 3    7, 3    1, 2    9, 6    0, 4    6, 0    3, 0    7, 7    1, 3    1, 1    5, 3    3, 8    1, 0    4, 9    
4, 7    8, 9    4, 0    0, 2    8, 7    5, 8    7, 0    1, 4    4, 9    8, 2    6, 9    9, 6    2, 1    1, 9    0, 8    6, 5    
6, 8    9, 6    1, 0    6, 9    4, 0    5, 1    2, 9    7, 3    5, 1    2, 5    6, 9    0, 9    7, 4    8, 1    5, 5    3, 4    
5, 9    0, 4    5, 4    2, 2    2, 6    7, 1    2, 0    6, 1    0, 4    9, 8    5, 7    5, 5    4, 6    9, 0    2, 8    8, 5    
8, 2    4, 2    0, 8    1, 1    0, 3    3, 4    1, 8    3, 1    6, 6    4, 1    3, 6    6, 0    1, 7    4, 8    1, 6    1, 1    
6, 2    1, 3    2, 4    0, 8    9, 0    3, 0    1, 1    3, 7    6, 2    2, 4    0, 9    3, 6    7, 2    1, 2    5, 0    8, 2    
2, 3    5, 6    7, 9    3, 0    9, 3    2, 6    4, 8    8, 7    9, 4    5, 3    0, 3    3, 0    5, 5    1, 4    6, 4    5, 2    
3, 2    4, 9    6, 9    4, 7    7, 1    0, 4    5, 8    7, 2    5, 2    5, 5    2, 1    9, 8    4, 9    6, 6    7, 7    0, 3    

3, 0    9, 0    6, 9    2, 3    6, 9    7, 4    9, 9    2, 5    8, 7    3, 3    9, 5    3, 7    0, 5    7, 6    0, 4    8, 1    
6, 1    2, 7    6, 7    0, 7    5, 8    4, 2    1, 9    8, 4    5, 7    0, 2    3, 1    1, 9    2, 1    8, 0    1, 7    
5, 4    9, 7    9, 3    7, 3    1, 2    9, 6    6, 0    7, 7    1, 3    1, 1    5, 3    3, 8    1, 0    4, 9    
4, 7    8, 9    4, 0    7, 0    1, 4    8, 2    0, 8    6, 5    
6, 8    5, 1    2, 9    5, 1    0, 9    5, 5    3, 4    
5, 9    2, 2    2, 6    7, 1    2, 0    9, 8    4, 6    2, 8    8, 5    
0, 3    1, 8    6, 6    4, 1    3, 6    4, 8    1, 6    
6, 2    2, 4    6, 2    2, 4    7, 2    5, 0    
5, 6    7, 9    9, 4    6, 4    5, 2    
3, 2    
于 2012-05-05T00:24:02.987 に答える