1

2 つの配列に共通の要素が含まれているかどうかを確認する簡単な方法はありますか? これは適切ですか?配列には char 型が含まれます。

Arrays.asList(encryptU).contains(Ualpha[randNum]));

前もって感謝します!

4

3 に答える 3

6

配列が小さい場合は、ネストされた for ループ (@scaryrawr など) を使用したソリューションが最適に機能します。

配列が十分に大きい場合、O(N^2)上記のソリューションの複雑さが問題になります。解決策は、HashSet を使用することです。例えば

HashSet<Character> tmp = new HashSet<Character>();
for (char ch : arr1) {
    tmp.add(ch);
}
for (char ch : arr2) {
    if (tmp.contains(ch)) {
        // elements in common!!
    }
}

これはO(N)間に合いますが、比例定数はかなり大きくなります。(ネストされたループ ソリューションよりも高速にするには、配列サイズの積を 20 または 30 にする必要があると思いますが、これは推測です。) また、これにはO(N)一時的なスペースが必要です。


文字の範囲BitSetが限られている場合は、 の代わりに を使用できますHashSetO(N)文字の範囲も複雑さの要因であるため、それを呼び出すことO(N)は単純化されすぎていますが、それは時間と空間の点でも大まかに言えます。


しかし、私たちはおそらくこれを「考えすぎ」ています。最良のアドバイスは、おそらく単純なものを実装することです。パフォーマンスが本当に問題であるという疑いがある場合は、それをプロファイルして、不必要な最適化で時間を無駄にしないようにしてください

于 2012-10-07T01:46:16.947 に答える
0

共通の要素:

char[] a = {...};
char[] b = {...};
boolean hasCommon = false;
for (char alpha : a) {
    for (char beta : b) {
        if (alpha == beta) {
            hasCommon = true;
            break;
        }
    }
    if (hasCommon) { break; }
}

一方のランダムな位置が他方に含まれているかどうかを確認するだけで、いくつかの偽陰性が得られます。

于 2012-10-07T01:18:30.997 に答える
0

この例を試してください

Character[] arr1 = {'a', 'b', 'c', 'd', 'e'}
Character[] arr2 = {'a', 'b', 'c', 'd', 'e'}

boolean matches = arr.toString().equals(arr2.toString());

これは、2 つの配列が正確に等しいかどうかをチェックします。

共通点があるかどうかを確認したい場合は、

List<Character> chars = Arrays.asList(arr1);
List<Character> chars2 = Arrays.asList(arr2);

boolean matches = (chars.retainAll(chars2).size()==0)?false:true;

お役に立てれば。

于 2012-10-07T01:23:54.877 に答える