HashSetを使用して、2つのComparable配列で共通の要素を見つける方法は?

IRGeekSauce

編集:メソッドシグネチャ

    public Comparable[][] findCommonElements(Comparable[][] collections)

間違っている。そのはず

    public Comparable[] findCommonElements(Comparable[][] collections)

しかし、IDEで変更すると、すべてが台無しになります。セットを完全に理解しておらず、2D配列がひどく混乱しているため、知識を超えたような気がします。

2つのComparable配列を取り線形時間効率それらを反復し、共通の要素を表示するアルゴリズムを作成する必要があります。HashSetを使用すると時間効率が最も速くなることを読みましたが、行き詰まりになりました。理由は次のとおりです。

指示と、メソッドのシグネチャである1行のコードが提供されました。

public Comparable[][] findCommonElements(Comparable[][] collections)

つまり、2D配列「コレクション」を返す必要があります。HashSetsの使用について教授にメールを送信したところ、次の問題がある場合を除いて、許可が与えられました。

「findCommonElementsメソッド内でHashSetを使用できますが、実行された比較の数をカウントできる必要があります。ハッシュは通常非常に効率的ですが、衝突が発生した場合にいくつかの比較が行われます。これを行うには、次のことを行う必要があります。使用するHashSetのソースコードにアクセスできます。また、比較の数を返すには、CommonElementsクラスに「getComparisons()」メソッドが必要です。」

プログラミングの2学期では、ハッシュセット、マップ、テーブルなどを学習しませんでした。これを自分で学習しようとしていますが、衝突について完全には理解していません。

私のコードは2つの配列を受け取り、共通の要素を返しますが、基本的にコンパイルするように記述したため、returnステートメントは厄介です(2d Comparable配列がパラメーターです)。

私はこれで正しい道を進んでいますか?コードは次のとおりです。

public class CommonElements {

    static Comparable[] collection1 = {"A", "B", "C", "D", "E"}; //first array
    static Comparable[] collection2 = {"A", "B", "C", "D", "E", "F", "G"}; //second array
    static Comparable[][] collections = {collection1, collection2}; //array to store common elements. 
    static Set<Comparable> commonStuff = new HashSet<>(); //instance of Set containing common elements

    public static void main(String[] args) {

        CommonElements commonElements = new CommonElements(); //create instance of class CommonElements
        commonElements.findCommonElements(collections); //call the find method

    }
    public Comparable[][] findCommonElements(Comparable[][] collections) {

        Set<Comparable> addSet = new HashSet<>(); //instance of Set to add elements to

        for (Comparable x : collection1) { //adding elements from first array to my addSet
            addSet.add(x);
        }
        for (Comparable x : collection2) {
            if (addSet.contains(x)) {
            commonStuff.add(x); //checking for common elements, add to commonStuff Set
            }
        }
        System.out.println(toString(commonStuff)); //print the toString method

        return collections; //return statement, otherwise Java will whine at me
    }
    public String toString(Set<Comparable> commonStuff) { //this method gets rid of the brackets
        String elements = commonStuff.toString(); //make a String and assign it to the Set
        elements = elements.replaceAll("\\[", "").replaceAll("\\]", ""); //replace both brackets with empty space

        return "Common Elements: " + elements; //return the Set as a new String
    }
}
IRGeekSauce

編集ApacheCommons ArrayUtilsをインポートしたことを忘れました。非常に便利。

私はそれを考え出した。あなたのすべての協力に感謝します。クラスのインスタンスを3回呼び出すmainメソッドと3つのテストメソッドがありますが、それらは関係ありません。これが私に問題を引き起こしていたものです、そして今それはうまくいきます。:-)

public int getComparisons() {
        return comparisons;
    } //method to return number of comparisons
    public static Comparable[] findCommonElements(Comparable[][] collections) {
        /*
        I LEARNED THAT WE HAD TO USE MORE THAN TWO ARRAYS, SO IT WAS BACK
        TO THE DRAWING BOARD FOR ME. I FIGURED IT OUT, THOUGH.
        */
        Comparable[] arr1 = collections[0]; //set initial values to 1 Dimensional arrays so the test methods can read their respective values
        Comparable[] arr2 = collections[1];
        Comparable[] arr3 = collections[2];

        /*
        THE FOLLOWING BLOCK OF CODE TAKES ALL THE PERMUTATIONS OF THE 3 ARRAYS (i.e. 1,2,3; 1,3,2; 2,1,3, etc),
        DETERMINES WHICH ARRAY IS THE SHORTEST, AND ADDS THE LONGER TWO ARRAYS TO A QUERY ARRAY.
         */
        if(arr1.length < arr2.length && arr1.length < arr3.length || arr2.length <= arr3.length) { //shortest array will become hash array. the other two will become a combined query array.
            hashArray = arr1;  //these will be utilized below to put into Sets
            queryArray = ArrayUtils.addAll(arr2, arr3);
        }
        else if(arr2.length < arr1.length && arr2.length < arr3.length || arr1.length <= arr3.length) {
            hashArray = arr2;
            queryArray = ArrayUtils.addAll(arr1, arr3);
        }
        else if(arr3.length < arr1.length && arr3.length < arr2.length || arr1.length <= arr2.length) {
            hashArray = arr3;
            queryArray = ArrayUtils.addAll(arr1, arr2);
        }
        HashSet<Comparable> intersectionSet = new HashSet<>(); //initialize Sets
        HashSet<Comparable> arrayToHash = new HashSet<>();
        for(Comparable element : hashArray) { //add shorter array to hashedArray Set
            arrayToHash.add(element);
        }
        //NOTE FROM THE JAVADOC ON THE IMPLEMENTATION OF .contains() USING HASHSET COMPARISONS
        /**
         * <p>This class offers constant time performance for the basic operations
         * (<tt>add</tt>, <tt>remove</tt>, <tt>contains</tt> and <tt>size</tt>),
         * assuming the hash function disperses the elements properly among the
         * buckets.
         */
        for(Comparable element : queryArray) {
            if(element != null) {
                comparisons++; // increment comparisons with each search
            }
            if(arrayToHash.contains(element)) { //search for matches and add to intersectionSet (.contains uses the equals method to determine if an object is within array)
                intersectionSet.add(element);
            }
        }
        return intersectionSet.toArray(new Comparable[0]); //return Set as Array defined in method signature
    }

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

2 つの配列で共通の要素を見つける方法は?

分類Dev

2つの配列で共通の要素を見つける

分類Dev

jqueryで2つの配列間でのみ共通要素を見つける方法

分類Dev

2つの配列間の共通要素の数を見つける

分類Dev

Matlab、2つのセル配列の共通要素を見つける

分類Dev

linqを使用して特定のHashSet要素を見つける方法

分類Dev

2つの文字列配列間で共通でない要素を見つける

分類Dev

Pythonで2つの要素を持つ配列の平均を見つける方法は?

分類Dev

2つの配列で共通の正確な要素を見つける

分類Dev

2つのリストの共通要素を見つける方法は?

分類Dev

すべての配列に共通する要素を見つける

分類Dev

複数の配列で共通の要素を見つけるphp

分類Dev

ループなしで2つの配列間で共通の要素を見つける

分類Dev

Angular2でObservableを使用してIDで配列の要素を見つける方法

分類Dev

単一の2D配列の行間で共通の要素を見つけようとしています

分類Dev

ラムダ式を使用して2つのリスト間で共通の要素を見つける

分類Dev

Pythonで配列内の要素の位置を見つける方法は?

分類Dev

javascriptで配列の中央の要素を見つける方法は?

分類Dev

2つの配列を使用して交差点を見つける

分類Dev

golangを使用して別の配列にない配列から要素を見つける方法は?

分類Dev

単一の配列の要素間の共通部分を見つける

分類Dev

Pythonを使用して2つのリストの共通部分のインデックスを見つける方法は?

分類Dev

要素の位置を見つける方法はnumpy配列です

分類Dev

javascript配列で等しい要素の数を見つける方法

分類Dev

2つの配列で共通の要素を見つけるためのJavascriptプログラム

分類Dev

Java、2つの配列の共通部分を見つける

分類Dev

C ++でSTLを使用して配列内の最小要素を見つける

分類Dev

Javaでn個の配列間の共通要素の合計を見つける

分類Dev

PHPの2つの配列内で共通の値を見つける

Related 関連記事

  1. 1

    2 つの配列で共通の要素を見つける方法は?

  2. 2

    2つの配列で共通の要素を見つける

  3. 3

    jqueryで2つの配列間でのみ共通要素を見つける方法

  4. 4

    2つの配列間の共通要素の数を見つける

  5. 5

    Matlab、2つのセル配列の共通要素を見つける

  6. 6

    linqを使用して特定のHashSet要素を見つける方法

  7. 7

    2つの文字列配列間で共通でない要素を見つける

  8. 8

    Pythonで2つの要素を持つ配列の平均を見つける方法は?

  9. 9

    2つの配列で共通の正確な要素を見つける

  10. 10

    2つのリストの共通要素を見つける方法は?

  11. 11

    すべての配列に共通する要素を見つける

  12. 12

    複数の配列で共通の要素を見つけるphp

  13. 13

    ループなしで2つの配列間で共通の要素を見つける

  14. 14

    Angular2でObservableを使用してIDで配列の要素を見つける方法

  15. 15

    単一の2D配列の行間で共通の要素を見つけようとしています

  16. 16

    ラムダ式を使用して2つのリスト間で共通の要素を見つける

  17. 17

    Pythonで配列内の要素の位置を見つける方法は?

  18. 18

    javascriptで配列の中央の要素を見つける方法は?

  19. 19

    2つの配列を使用して交差点を見つける

  20. 20

    golangを使用して別の配列にない配列から要素を見つける方法は?

  21. 21

    単一の配列の要素間の共通部分を見つける

  22. 22

    Pythonを使用して2つのリストの共通部分のインデックスを見つける方法は?

  23. 23

    要素の位置を見つける方法はnumpy配列です

  24. 24

    javascript配列で等しい要素の数を見つける方法

  25. 25

    2つの配列で共通の要素を見つけるためのJavascriptプログラム

  26. 26

    Java、2つの配列の共通部分を見つける

  27. 27

    C ++でSTLを使用して配列内の最小要素を見つける

  28. 28

    Javaでn個の配列間の共通要素の合計を見つける

  29. 29

    PHPの2つの配列内で共通の値を見つける

ホットタグ

アーカイブ