Sobes.tech
Senior

/* SELECTARE stânga.K, stânga.V1, dreapta.V2 DIN stânga JOIN dreapta ON stânga.K = dreapta.K; */ public <K extends Comparable<K>, V1, V2> List<Triple<K, V1, V2>> join(List<Pair<K, V1>> stanga, List<Pair<K, V2>> dreapta) { return null; } private static class Pair<A, B> { private A primul; private B al doilea; Pair(A primul, B al doilea) { this.primul = primul; this.al doilea = al doilea; } } private static class Triple<A, B, C> { private A primul; private B al doilea; private C al treilea; Triple(A primul, B al doilea, C al treilea) { this.primul = primul; this.al doilea = al doilea; this.al treilea = al treilea; } }

sobes.tech AI

Răspuns de la AI

Mai jos se prezintă o implementare a funcției join, care efectuează o îmbinare internă (inner join) a două liste de perechi după cheia K. Pentru eficiență, se folosește un Map pentru a căuta rapid elementele corespunzătoare din a doua listă.

public <K extends Comparable<K>, V1, V2> List<Triple<K, V1, V2>> join(List<Pair<K, V1>> left, List<Pair<K, V2>> right) {
    Map<K, V2> rightMap = new HashMap<>();
    for (Pair<K, V2> pair : right) {
        rightMap.put(pair.first, pair.second);
    }

    List<Triple<K, V1, V2>> result = new ArrayList<>();
    for (Pair<K, V1> pairLeft : left) {
        V2 v2 = rightMap.get(pairLeft.first);
        if (v2 != null) {
            result.add(new Triple<>(pairLeft.first, pairLeft.second, v2));
        }
    }
    return result;
}

Aici:

  • Se creează un dicționar din lista dreaptă pentru căutări rapide după cheie.
  • Se parcurge lista stângă, pentru fiecare cheie se caută valoarea corespunzătoare în dicționar.
  • Dacă se găsește, se creează un Triple și se adaugă în rezultat.

Aceasta corespunde unei interogări SQL cu JOIN după cheia K.