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.