import java.util.*;
public class Main {
public static void main
(String[] args
) { Kamus kamus = new Kamus();
kamus.
tambah("big",
new String[] { "large",
"great" }); kamus.
tambah("big",
new String[] { "huge",
"fat" }); kamus.
tambah("huge",
new String[] { "enormous",
"gigantic" });
System.
out.
println(Arrays.
toString(kamus.
ambilSinonim("big"))); System.
out.
println(Arrays.
toString(kamus.
ambilSinonim("huge"))); System.
out.
println(Arrays.
toString(kamus.
ambilSinonim("gigantic"))); System.
out.
println(Arrays.
toString(kamus.
ambilSinonim("colossal"))); }
}
class Kamus {
// Asumsi urutan sinonim tidak harus sesuai urutan penambahannya.
// Kalau ingin sesuai urutan saya harus buat HashMap baru yang valuenya
// adalah list of strings dan HashMap yang lama akan saya gunakan
// untuk pengecekan sinonim sebelum menambahkan kata baru ke list
// agar efisien.
private HashMap
<String, Set
<String
>> kamus
= new HashMap
<>();
kamus.putIfAbsent(kata, new HashSet<>());
Set<String> sinonimSet = kamus.get(kata);
for (String sinonimKata
: sinonim
) { sinonimSet.add(sinonimKata);
kamus.putIfAbsent(sinonimKata, new HashSet<>());
kamus.get(sinonimKata).add(kata);
}
}
if (kamus.containsKey(kata)) {
Set<String> sinonimSet = kamus.get(kata);
return sinonimSet.
toArray(new String[0]); } else {
return null;
}
}
}
aW1wb3J0IGphdmEudXRpbC4qOwoKcHVibGljIGNsYXNzIE1haW4gewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewogICAgICAgIEthbXVzIGthbXVzID0gbmV3IEthbXVzKCk7CiAgICAgICAga2FtdXMudGFtYmFoKCJiaWciLCBuZXcgU3RyaW5nW10geyAibGFyZ2UiLCAiZ3JlYXQiIH0pOwogICAgICAgIGthbXVzLnRhbWJhaCgiYmlnIiwgbmV3IFN0cmluZ1tdIHsgImh1Z2UiLCAiZmF0IiB9KTsKICAgICAgICBrYW11cy50YW1iYWgoImh1Z2UiLCBuZXcgU3RyaW5nW10geyAiZW5vcm1vdXMiLCAiZ2lnYW50aWMiIH0pOwoKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLnRvU3RyaW5nKGthbXVzLmFtYmlsU2lub25pbSgiYmlnIikpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLnRvU3RyaW5nKGthbXVzLmFtYmlsU2lub25pbSgiaHVnZSIpKSk7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEFycmF5cy50b1N0cmluZyhrYW11cy5hbWJpbFNpbm9uaW0oImdpZ2FudGljIikpKTsKICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQXJyYXlzLnRvU3RyaW5nKGthbXVzLmFtYmlsU2lub25pbSgiY29sb3NzYWwiKSkpOwogICAgfQp9CgpjbGFzcyBLYW11cyB7CgkvLyBBc3Vtc2kgdXJ1dGFuIHNpbm9uaW0gdGlkYWsgaGFydXMgc2VzdWFpIHVydXRhbiBwZW5hbWJhaGFubnlhLgoJLy8gS2FsYXUgaW5naW4gc2VzdWFpIHVydXRhbiBzYXlhIGhhcnVzIGJ1YXQgSGFzaE1hcCBiYXJ1IHlhbmcgdmFsdWVueWEKCS8vIGFkYWxhaCBsaXN0IG9mIHN0cmluZ3MgZGFuIEhhc2hNYXAgeWFuZyBsYW1hIGFrYW4gc2F5YSBndW5ha2FuCgkvLyB1bnR1ayBwZW5nZWNla2FuIHNpbm9uaW0gc2ViZWx1bSBtZW5hbWJhaGthbiBrYXRhIGJhcnUga2UgbGlzdAoJLy8gYWdhciBlZmlzaWVuLgogICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IGthbXVzID0gbmV3IEhhc2hNYXA8PigpOwoKICAgIHB1YmxpYyB2b2lkIHRhbWJhaChTdHJpbmcga2F0YSwgU3RyaW5nW10gc2lub25pbSkgewogICAgICAgIGthbXVzLnB1dElmQWJzZW50KGthdGEsIG5ldyBIYXNoU2V0PD4oKSk7CiAgICAgICAgU2V0PFN0cmluZz4gc2lub25pbVNldCA9IGthbXVzLmdldChrYXRhKTsKICAgICAgICBmb3IgKFN0cmluZyBzaW5vbmltS2F0YSA6IHNpbm9uaW0pIHsKICAgICAgICAgICAgc2lub25pbVNldC5hZGQoc2lub25pbUthdGEpOwogICAgICAgICAgICBrYW11cy5wdXRJZkFic2VudChzaW5vbmltS2F0YSwgbmV3IEhhc2hTZXQ8PigpKTsKICAgICAgICAgICAga2FtdXMuZ2V0KHNpbm9uaW1LYXRhKS5hZGQoa2F0YSk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBTdHJpbmdbXSBhbWJpbFNpbm9uaW0oU3RyaW5nIGthdGEpIHsKICAgICAgICBpZiAoa2FtdXMuY29udGFpbnNLZXkoa2F0YSkpIHsKICAgICAgICAgICAgU2V0PFN0cmluZz4gc2lub25pbVNldCA9IGthbXVzLmdldChrYXRhKTsKICAgICAgICAgICAgcmV0dXJuIHNpbm9uaW1TZXQudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9Cn0K