0

2つのSQLテーブルがあります。で両方のテーブルを取得した後、共通のid列で並べResultSets替えてに保存しました。String[][]sこれらのテーブルには同じデータが含まれている必要がありますが、一方が他方から同じ行の重複を持っている可能性があります。String[]テーブルAのすべてがテーブルBに少なくとも1回存在するかどうかを確認するには、。に対してある程度効率的なcontains()-esqueメソッドを作成する必要がありString[]ます。

これは私がこれまでに持っているものですが、困惑しています(はるかに効率的な解決策があるかどうかもわかりません)。ソーステーブルとターゲットテーブルを指定します。String[]ソーステーブル内のそれぞれを取得し、ターゲットテーブル内のそれぞれを調べて、元の要素ごとに一致するものが少なくとも1つあるかどうかを確認することにより、ターゲット内のどこかにString[]ソースのインスタンスを見つけます。誰かが私を正しい方向に向けたり、空白を埋めたりすることはできますか?これは宿題でも割り当てでもありません。私はいくつかのコードをリファクタリングしていて、大きなおならをしています。ありがとう!String[]String[][]String[]String[]

    public boolean targetContainsSource(String[][] s, String[][] t) {
    boolean result = true;

    //For each String[] in String[][] s
    for (int i = 0; i < s.length; i++) {

        //For each String[] in String[][] t
        for (int j = 0; j < t.length; j++) {

            //For each String in t's String[]
            for (int k = 0; k < t[0].length; k++) {
                if (!s[i][k].equals(t[j][k])) {

                }
            }
        }
    }

    return result;
}
4

2 に答える 2

3

Arrays.equals()を使用すると、最も内側のループを削除できます。

最初の配列の要素ごとに、foundブール変数を定義する必要があります。ブール変数は、要素が2番目の配列で見つかった場合にのみtrueに設定されます。2番目のループが終了しても、この変数がまだfalseの場合は、2番目の配列にない最初の配列の要素が見つかったので、すぐに戻ることができます。

そしてもちろん、この変数がtrueに設定されるとすぐに、2番目のループから抜け出すことができます。

于 2012-06-04T19:59:52.663 に答える
0

基本的に、通常は次のことを行う必要があります。

  • 強力なハッシュ関数を使用して、各行のハッシュを取得します。これにより、単一の整数(おそらく十分に強力になるまでの長さ)または行全体を表す単一の文字列/バイト配列が得られます。
  • 次に、行の2つの「リスト」を比較しているかのように進みます。これらの「リスト」の少なくとも1つは、実際にはHashSet / HashMapに格納する必要があり、そのcontains()メソッドは効率的です。

ハッシュ関数にはMD5を使用できます(たとえば、このコードを使用できますが、「SHA-1」の代わりに「MD5」を使用します)。MessageDigest.compare()を使用して、ハッシュコードを表すバイト配列と比較できます。

行の数が少ない(たとえば、数万)場合は、64ビットのハッシュコードを使用できます。これには、各ハッシュが長い時間で格納されるため、ビット数が少ないという利点があります。簡単にハッシュして比較できます。ただし、64ビットハッシュコードは、数万から数十万のオブジェクト(=この場合は異なる行)のハッシュの一意性を保証するのに十分な強度しかありません。

PSすべてのデータをメモリに格納する準備ができている場合は、各行の「ハッシュ」として、すべての列を1つの文字列にまとめて使用することもできます。秘訣は、チェックを効率的にして、テーブルの行表現の1つをHashSet/HashMapに格納することです。

于 2012-06-04T20:00:41.727 に答える