Senior
/* VÝBER vľavo.K, vľavo.V1, vpravo.V2 Z vľavo JOIN vpravo ON vľavo.K = vpravo.K; */ public <K extends Comparable<K>, V1, V2> List<Triple<K, V1, V2>> join(List<Pair<K, V1>> vľavo, List<Pair<K, V2>> vpravo) { return null; } private static class Pair<A, B> { private A prvé; private B druhé; Pair(A prvé, B druhé) { this.prvé = prvé; this.druhé = druhé; } } private static class Triple<A, B, C> { private A prvé; private B druhé; private C tretie; Triple(A prvé, B druhé, C tretie) { this.prvé = prvé; this.druhé = druhé; this.tretie = tretie; } }
sobes.tech AI
Odpoveď od AI
Nižšie je uvedená implementácia funkcie join, ktorá vykonáva vnorené spojenie (inner join) dvoch zoznamov dvojíc podľa kľúča K. Pre efektívnosť sa používa Map na rýchle vyhľadávanie zodpovedajúcich prvkov z druhého zoznamu.
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;
}
Tu:
- Vytvára sa slovník z pravého zoznamu pre rýchle vyhľadávanie podľa kľúča.
- Prechádza sa ľavý zoznam, pre každý kľúč sa hľadá zodpovedajúca hodnota v slovníku.
- Ak sa nájde, vytvorí sa Triple a pridá sa do výsledku.
Toto zodpovedá SQL dopytu s JOIN podľa kľúča K.