HashMap mehrere Keys zu einem Value

S.beginner

Neues Mitglied
Hallo,

Ich versuche einen Kundenservice zu simulieren. Dabei kann der Kunde dem Programm eine Frage stellen. Die Frage wird nach Schlagwörtern untersucht, die in meiner HashMap als Schlüssel-Objekte hinterlegt sind. Passend zu dem Schlagwort wird dann eine vorgefertigte Antwort zurückgegeben.

Dies sieht bei mir jetzt so aus:
Java:
private void antwortMapBefuellen()

    {

        antwortMap.put("absturz",

                       "Tja, auf unserem System kommt es nie zu einem Absturz. Das muss \n" +

                       "an Ihrem System liegen. Welche Konfiguration haben Sie?");

        antwortMap.put("abstürzt",

                       "Tja, auf unserem System kommt es nie zu einem Absturz. Das muss \n" +

                       "an Ihrem System liegen. Welche Konfiguration haben Sie?");

        antwortMap.put("stürzt",

                       "Tja, auf unserem System kommt es nie zu einem Absturz. Das muss \n" +

                       "an Ihrem System liegen. Welche Konfiguration haben Sie?");}

Wie man sieht führen mehrere Schlüssel-Objekte zu demselben Wert-Objekt.
Gibt es eine Möglichkeit dies einfacher darzustellen, sodass Ich nicht immer dieselbe Antwort zu leicht abgewandelten Schlagwörten schreiben muss?

Schonmal im Voraus danke für alle Antworten. Dies ist meine erste Frage in dem Forum, also wenn ich irgendetwas übersehen haben sollte oder offensichtlich Falsch gemacht habe gerne Rückmeldungen 🙂.
 
Eine Idee wäre eine Map mit allen Varianten davor zuschalten und nur eine "Stamm"variante zu verwalten.
Java:
public String antwort(String wort) {
  Objects.requireNonNull(wort);
  Map<String, String> aggregates = Map.of("absturz", "absturz", "abstürzt", "absturz", "stürzt", "absturz");
  Map<String, String> antwortMap = Map.of("absturz", "Tja, auf ...", "default", "Oooops");

  return antwortMap.get(aggregates.getOrDefault(wort, "default"));
}
 
Danke für die Antwort,

die Idee hat mich weitergebracht. Ich habe es aber etwas umständlicher gelöst, weil ich den Code nicht ganz verstanden hab, soweit bin ich glaub ich noch nicht.

Für alle die es interessiert, so habe ich es versucht:
Java:
public class Beantworter
{
    // Abbildung von Stichwörtern auf Antworten.
    private HashMap<String, String> antwortMap;

    // Liste von Standardantworten, falls kein Wort erkannt wird.
    private ArrayList<String> standardantworten;
}

public Beantworter()
    {
        antwortMap = new HashMap<String, String>();
        standardantworten = new ArrayList<String>();
        antwortMapBefuellen();
        standardantwortlisteFuellen();
}

public String generiereAntwort(HashSet<String> woerter)
    {
        Map<String, String> sammlung = Map.of("absturz", "absturz", "abstürzt", "absturz", "stürzt", "absturz");
        for (String wort : woerter) {
            String schlagwort = sammlung.get(wort);
            if(schlagwort != null){
                return antwortMap.get(schlagwort);
            }
            
            String antwort = antwortMap.get(wort);
            if(antwort != null) {
                return antwort;
            }
        }
        // Es wurde keines der Eingabewörter erkannt.
        // In diesem Fall wählen wir eine unserer Standardantworten (die
        // wir geben, wenn uns nichts Besseres mehr einfällt).
        
        return standardantwortAuswählen();
    }

private void antwortMapBefuellen()
    {
        antwortMap.put("absturz",
                       "Tja, auf unserem System kommt es nie zu einem Absturz. Das muss \n" +
                       "an Ihrem System liegen. Welche Konfiguration haben Sie?");
}

private void standardantwortlisteFuellen()
    {
        standardantworten.add("Das klingt seltsam. Können Sie das Problem ausführlicher beschreiben?");
        standardantworten.add("Bisher hat sich noch kein Kunde darüber beschwert. \n" +
                        "Welche Systemkonfiguration haben Sie?");
}

Es hat zwar funktioniert, ist aber keine sehr elegante Lösung.
 
Gibt es eine Möglichkeit dies einfacher darzustellen, sodass Ich nicht immer dieselbe Antwort zu leicht abgewandelten Schlagwörten schreiben muss?
Die Idee von @Flown hat den Vorteil, dass Wörter von den Antworten geternnt verwaltet werden. Somit lassen sich die Antworten und die Wörter unabhängig voneinander bearbeiten. Das ist aus fachlicher Sicht durchaus interessant, insbesondere, wenn man später Alternativwörter hinzufügen möchte.

Braucht man das nicht, würde mir spontan eine Variable einfallen:
Java:
String absturz =
        "Tja, auf unserem System kommt es nie zu einem Absturz. Das muss \n" +
        "an Ihrem System liegen. Welche Konfiguration haben Sie?";

map.put("absturz", absturz);
map.put("abgestürzt", absturz);
// usw.
Die Antwort und die Wörter kann man durch Parameter ersetzen, wenn man den Spaß in eine Methode gießt:
Java:
void neueAntwort(String antwort, String wort, String ... alternativen) {
    map.put(wort, antwort);
    for (String alternative : alternativen) {
        map.put(alternative, antwort);
    }
}
Damit lässt sich nun schreiben
Java:
neueAntwort(
        "Tja, auf unserem System kommt es nie zu einem Absturz. Das muss \n" +
        "an Ihrem System liegen. Welche Konfiguration haben Sie?",
        "absturz", "abgestürzt", "abstürzt");
Natürlich ist das ausbaufähig, z. B. mit dem Builder-Pattern und eine fluent API.
 

Zurück
Oben