Mocking conține () cu un șir [] []

Am două tabele SQL. După ce am luat ambele tabele în ResultSets , le-am stocat în String [] [] s , ordonate printr-o coloană id comună. Aceste tabele trebuie să conțină aceleași date, cu toate acestea, pot exista duplicate ale aceluiași rând de la celălalt. Pentru a verifica dacă fiecare String [] din tabelul A este prezent cel puțin o dată în tabelul B, trebuie să construiesc o code> String [] .

Aceasta este ceea ce am până acum, dar sunt încurcat (de asemenea, nu sunt sigur dacă există o soluție mult mai eficientă). Dați-i tabelul sursă și tabela țintă. Se ia fiecare String [] in tabela sursa si ar trebui sa treaca prin fiecare String [] in tabela destinatie si sa gaseasca o instanta a codului sursa < ] undeva în String [] [] , verificând dacă există cel puțin un String [] cod>, element după element. Poate cineva să mă îndrepte în direcția corectă și/sau să completez spațiile libere? Nu e vorba de temele la domiciliu sau de orice misiune, refacționez un anumit cod și am un fart de creier major. Mulțumiri!

    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;
}
0

2 răspunsuri

Cea mai interioară buclă poate fi eliminată utilizând Arrays.equals() .

Pentru fiecare element al primei matrice ar trebui să definiți o variabilă booleană found , care ar fi setată la adevărat numai după ce elementul va fi găsit în a doua matrice. Odată ce a doua bucla este terminată, dacă această variabilă este încă falsă, ați găsit un element din prima matrice care nu este în cel de-al doilea și puteți reveni imediat.

Și, desigur, de îndată ce această variabilă este setată la adevărat, puteți ieși din a doua bucla.

0
adăugat
Mulțumiri! Mă gândeam la booleani, dar nu puteam să-mi pun gândurile într-un algoritm de lucru.
adăugat autor Chris, sursa

În esență, în general, trebuie să faceți următoarele:

  • utilizați o funcție hash puternică pentru a a lua un hash din fiecare rând: aceasta vă oferă o singură întreagă (probabil o lungă pentru a fi suficient de puternică) sau o singură șir de caractere/byte reprezentând întregul rând < li>
  • apoi continuați ca și cum ați compara două "liste" de rânduri. Cel puțin una dintre aceste "liste" ar trebui efectiv stocată într-un HashSet/HashMap, a cărui metodă conține() este eficientă.

Pentru funcția hash ați putea folosi MD5 (de exemplu, puteți utilizați acest cod , dar utilizați "MD5" în loc de "SHA-1"). Puteți utiliza MessageDigest.compare() pentru a compara matricele de octeți care reprezintă codurile hash.

Dacă aveți doar un număr mic (de exemplu, câteva zeci de mii) de rânduri, atunci puteți să utilizați un cod de hash pe 64 de biți - acest lucru are doar avantajul că fiecare hash este stocat într-o perioadă lungă, astfel încât să fie puțin mai ușor să schimbe și să compare. Dar codurile hash pe 64 de biți sunt suficient de puternice pentru a garanta unicitatea numărului de cenți de zeci la sute de mii de obiecte (= rânduri diferite în cazul tău).

P.S. Dacă sunteți pregătit să stocați toate datele în memorie, puteți folosi și ca "hash" pentru fiecare rând toate coloanele concetate împreună într-un singur șir. Scopul este de a face verificarea eficientă pentru a avea una dintre reprezentările rândului de tabele stocate într-un HashSet/HashMap.

0
adăugat