Nama : Erlangga Rizqi Dwi Raswanto
NRP : 5025241179
Kelas : PBO A
Kode FRSSupportApp.java
Tujuan: titik masuk program, menangani loop input, menampilkan bantuan, daftar kata kunci (faq), dan keluar program.
import java.util.Scanner;
public class FRSSupportApp
{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
Responder responder = new Responder();
System.out.println("=== FRS Technical Support (Console) ===");
System.out.println("Ketik keluhan Anda (contoh: 'login gagal', 'jadwal bentrok').");
System.out.println("Perintah: 'faq' (lihat kata kunci), 'help' (bantuan), 'exit' (keluar).\n");
while(true){
System.out.print("> ");
if (!sc.hasNextLine()) break;
String input = sc.nextLine().trim();
if (input.equalsIgnoreCase("exit")){
System.out.println("Terimakasih! Semoga masalah anda terselesaikan!");
break;
}
if (input.equalsIgnoreCase("help")){
System.out.println("Bantuan: ");
System.out.println("Sistem cocokan kata kunci dan beri solusi");
System.out.println("Perintah: faq, help, exit.\n");
continue;
}
if (input.equalsIgnoreCase("faq")){
System.out.println(responder.faq());
continue;
}
System.out.println(responder.getResponse(input));
}
sc.close();
}
} Penjelasan singkat:
-
Menampilkan welcome dan daftar perintah (
faq,help,exit). -
Membaca input pengguna baris demi baris.
-
Mengarahkan pemrosesan ke
Responder.getResponse(...). -
faqmemanggilResponder.faq()untuk menampilkan kata kunci yang dikenali.
Kode Responder.java
Tujuan: menyimpan basis pengetahuan (kata kunci → jawaban), menyiapkan jawaban generik, dan mengimplementasikan strategi pencocokan.
import java.util.*;
public class Responder{
private final Map<String, String> responses = new LinkedHashMap();
private final List<String> generics = new ArrayList<>();
private final List<String> keysByLength = new ArrayList<>();
private final Random rng = new Random();
public Responder() {
responses.put("kelas penuh", "Hubungi TU/dosen pengampu untuk pembukaan kelas tambahan atau cari kelas paralel lain.");
responses.put("salah ambil kelas", "Drop kelas yang salah dan ambil kelas yang sesuai pada periode revisi.");
responses.put("login gagal", "Periksa NRP/password. Jika tetap gagal, reset password via portal DPTSI.");
responses.put("gagal ambil kelas", "Cek prasyarat & sisa SKS. Pastikan prasyarat mata kuliah terpenuhi.");
responses.put("jadwal bentrok", "Pilih kelas lain dengan jadwal berbeda atau konsultasi ke dosen wali.");
responses.put("gagal akses website", "Coba beberapa saat lagi, cek koneksi, nonaktifkan VPN, atau hubungi DPTSI.");
responses.put("pilihan tidak muncul", "Pastikan periode FRS sudah dibuka & data semester benar. Jika belum, hubungi TU.");
responses.put("captcha salah", "Ketik ulang captcha, refresh halaman, atau coba browser lain.");
responses.put("frs belum disetujui", "Hubungi dosen wali untuk persetujuan FRS.");
responses.put("frs ditutup", "Periode FRS berakhir. Koordinasikan dengan dosen wali/TU untuk opsi lanjutan.");
responses.put("web lag", "Bersihkan cache browser, coba jaringan lain, dan muat ulang halaman.");
responses.put("sks", "Cek batas maksimum SKS semester ini di portal & total SKS yang diambil.");
responses.put("prasyarat", "Pastikan MK prasyarat telah lulus/terpenuhi sebelum mengambil MK terkait.");
responses.put("hapus matkul", "Ubah/drop KRS hanya saat periode revisi. Cek kalender akademik.");
generics.add("Bisa jelaskan lebih detail kendalanya?");
generics.add("Saya belum paham, boleh diulang lebih spesifik?");
keysByLength.addAll(responses.keySet());
keysByLength.sort((a, b) -> Integer.compare(b.length(), a.length()));
}
public String faq(){
StringBuilder sb = new StringBuilder("Kata kunci yang dikenali:\n");
int i = 1;
for (String k : keysByLength) sb.append(i++).append(". ").append(k).append("\n");
sb.append("\nContoh: 'Saya login gagal dari tadi malam'.");
return sb.toString();
}
public String getResponse(String userInput){
if (userInput == null || userInput.trim().isEmpty()){
return pickGeneric();
}
String text = normalize(userInput);
for (String key : keysByLength){
if (text.contains(key)){
return responses.get(key);
}
}
for (String w : text.split("\\s+")){
if(responses.containsKey(w)){
return responses.get(w);
}
}
return pickGeneric();
}
private String pickGeneric(){
return generics.get(rng.nextInt(generics.size()));
}
private String normalize(String s){
String lower = s.toLowerCase();
lower = lower.replaceAll("[^\\p{L}\\p{Nd}\\s]", " ");
return lower.replaceAll("\\s+", " ").trim();
}
} Penjelasan singkat:
-
responses(LinkedHashMap) menyimpan keyword → saran. Pemakaian LinkedHashMap mempertahankan urutan penambahan, sehingga daftar padafaq()tampil rapi dan konsisten. -
generics(ArrayList) berisi jawaban umum jika tidak ada kecocokan. -
keysByLengthmenyimpan semua kata kunci yang diurutkan dari yang terpanjang. Ini penting agar frasa seperti “login gagal” tidak kalah oleh kata tunggal “login”. -
normalize(...)menurunkan huruf, menghapus tanda baca, serta merapikan spasi supaya pencocokan.contains(...)lebih stabil. -
Alur pencocokan:
-
Coba cocokkan frasa terpanjang (
keysByLength). -
Jika gagal, coba cocokkan per-kata.
-
Jika tetap tidak ada, kembalikan jawaban generik acak (
pickGeneric()).
Tidak ada komentar:
Posting Komentar