2015-04-29 7 views
5

Ich habe ein Problem mit einer Hashmap. In meiner hashmap-Methode möchte ich zwei oder mehr Schlüsselwörter als einen Schlüssel haben, der dazu neigt, einen zu haben. Zum Beispiel möchte ich, dass der Benutzer einen Satz mit zwei oder mehr Schlüsselwörtern eingibt, wobei angenommen wird, dass "Professorenname" ein Schlüsselwort ist. Zum Beispiel:Verstehen Sie zwei oder mehr Schlüssel mit Hashmaps

String[] temp3 = { "instructor","teacher","mentor" }; 
    responses.put("professor name", temp3); 

Und der Benutzer gibt "was ist der Professor Name" der Code hängt einfach. Aber auf der anderen Seite, wenn

String[] temp3 = { "instructor","teacher","mentor" }; 
    responses.put("professor", temp3); 

der Code funktioniert. Ich möchte also in der Lage sein, einen Satz einzugeben, der zwei oder mehr Schlüsselwörter enthält, die einem gegenüberstehen. Ich werde jede Art von Hilfe zu schätzen wissen.

Hier ist meine hashmap Methode

private static HashMap<String, String[]> populateSynonymMap() { 

    String[] temp1 = { "instructor","teacher","mentor" }; 
    responses.put("professor name", temp1); 
    String[] temp2 = { "amount of test","test load","quantity of test" }; 

    return responses; 
} 

und hier ist meine Hauptmethode

public static void main(String args[]) throws ParseException, IOException { 
    /* Initialization */ 
    HashMap<String, String[]> synonymMap = new HashMap<String, String[]>(); 
    synonymMap = populateSynonymMap(); // populate the map 


    Scanner scanner = new Scanner(System.in); 
    String input = null; 
    /*End Initialization*/ 
    System.out.println("Welcome To DataBase "); 
    System.out.println("What would you like to know?"); 

    System.out.print("> "); 
    input = scanner.nextLine().toLowerCase(); 
    String[] inputs = input.split(" "); 
     for (String ing : inputs) { // iterate over each word of the sentence. 
     boolean found = false; 
     for (Map.Entry<String, String[]> entry : synonymMap.entrySet()) { 
      String key = entry.getKey(); 
      String[] value = entry.getValue(); 
      if (key.equals(ing) || Arrays.asList(value).contains(ing)) { 

       found = true; 
       parseFile(entry.getKey());`` 
      } 
      break; 
    } 
       if (found) { 
      break; 
     } 


    } 
} 

Unter der Annahme, dass die ParseFile Methode

+0

Ich verstehe nicht –

+0

Ja Sir genau so –

+2

einen Satz Schlüssel „foo bar baz“ In Anbetracht, jedes einzelne Wort verwenden, sollten die Daten, aber was ist mit mehreren Wortuntergruppen, zB „foo baz“ return - sollte „foo baz "finden auch eine Übereinstimmung oder nur einzelne Wörter des Satzes? Hinweis: Wenn Sie "nein" sagen, werde ich die Frage beantworten (weil es eine einfache Lösung gibt), wenn "ja" vielleicht nicht :) – Bohemian

Antwort

0

Ich würde String enthält Methode verwenden, um mehrere Wörter zu überprüfen. Dies wird Ihr Problem lösen, einzelne Wörter wie "Professor" oder mehrere Wörter wie "Was ist Ihr Professor Name" Problem zu überprüfen.

System.out.print("> "); 
    input = scanner.nextLine().toLowerCase(); 

    for (Map.Entry<String, String[]> entry : synonymMap.entrySet()) { 
     String key = entry.getKey(); 
     String[] value = entry.getValue(); 
     if (input.contains(key) || key.contains(input)) { 
      System.out.println("Input found in database -> " +Arrays.asList(value)); 
      break; 
     } 
    } 

Jetzt wird es mit einem Wort oder mehreren Wörtern arbeiten. Aber das funktioniert, wenn Wörter in der gleichen Reihenfolge eingegeben werden. Sie können es so aufwändig machen, wie Sie möchten.

Zum Beispiel können Sie dies auf separate Wörter der Eingabe und Ausgabe von Satz aus den Sätzen zu erweitern und dann finden, wie viele Wörter übereinstimmt usw. Und ich empfehle, dass Sie eine andere Datenstruktur verwenden, die diese Aufgabe natürlich aussieht. Sie können darüber nachdenken, Ihre Datenbank nach Wörtern und Synonymen zu ordnen, so dass Sie sich nicht um Fälle kümmern müssen, in denen der Wert einer Synonymliste ein anderes Synonym hat usw. Und die Suche kann nur auf Wörtern basieren.

+0

Okay, dieser Code ist in Ordnung, aber was ist, wenn die Werte der hashmap auch zwei oder mehr Wörter enthalten? zB wenn String [] temp1 = {"Lehrer Name", "Lehrer Raum", "Mentor Ort"}; responses.put ("professor name", temp1); –

+0

Welche andere Datenstruktur empfehlen Sie? @Kognizant –

+0

@ Curtis, sorry, aber habe nicht verstanden, Ihr Problem mit mehreren Wörtern in Wert. Wir vergleichen es nicht und selbst wenn wir dann wie gesagt vergleichen, müssen Sie drei Wörterlisten erstellen, eine für die Eingabe, eine für die Schlüssel und eine für die entsprechenden Werte. Überprüfen Sie dann, ob Eingabe Teil der Schlüsselliste ist, wenn nicht, dann Werteliste. – Yantraguru

0

Verwenden Sie den Typ HashMap<List<String>,String[]> oder HashMap<Set<String>,String[]> für die Fälle funktioniert, wo die Reihenfolge ist und spielt keine Rolle, anstelle von HashMap<String,String[]>. Im ersten Fall sind Ihre Schlüssel vom Typ List<String> und im zweiten Fall vom Typ Set<String>.

Best Practice wäre es, alle Schlüssel mit Collections.unmodiable * -Methoden zu umhüllen, bevor Sie sie als Schlüssel verwenden - wenn sie in HashMap-Bereichen geändert werden, ist das Verhalten Ihres Programms undefiniert.

+0

Ah, Backticker dünner. Ich fragte mich, wie ich diese Einlagen bekommen sollte. TYVM. – BadZen

+1

Diese Antwort lässt ein wichtiges Problem aus: Was sollte das Programm bei der Kartensuche überprüfen?Wenn in dem Set Fall ein Satz n Wörter hat, muss das Programm 2 ** n-1 Mengen erzeugen, um die Suche durchzuführen - an diesem Punkt könnte es sich lohnen zu fragen, ob eine völlig andere Datenstruktur vorliegen könnte besser. Dies ist kein leichtes Problem. – ajb

+0

@ajb - Du liegst nicht falsch! Aber die Frage fragt speziell, wie man zusammengesetzte Schlüssel in einer HashMap verwendet, und nicht, was die effizienteste oder performanteste Art ist, eine Volltext-Schlüsselwortsuche durchzuführen. – BadZen

Verwandte Themen