Frage von Dante93, 48

Java: kann mir wer helfen?

Hallöschen, ich habe vor kurzem mit Java angefangen und bin noch ein ziemlicher Anfänger. Ich versuche es mit "Learning by doing" und hänge schon ganz am Anfang :D Ich wollte ein programm entwickeln, mit dem ich z.b. etwas auf google suchen kann oder Lieder starten kann, die ich auf dem Rechner habe. Also müsste mein Programm das eingegebene genau auslesen. z.b. Tippe ich ein "starte Mambo Nr. 5" oder "suche Affen auf youtube/google" Dann muss ja einmal das "starte/suche" erkannt werden, dass youtube/google" und den andren Quak müsste in einer Variable gespeichert werden. Wie stelle ich das am besten an? Danke schonmal

Antwort
von Berny96, 31

Du bräuchtest einen bestimmten Syntax wo dran du dich hälst. Also im Prinzip deine eigene Grammatik und das könnte würde in deinem Fall sein:

Verb,  Attribut, Objekt.

Suche, Affe, Google.

In deinem Programm musst du diese nur noch in von der Eingabe teilen. Das heisst der Nutzer soll zum Beispiel Verb, Komma, Attribut, Komma, Objekt eingeben. So kannst du die Eignabe nach Komma aufteilen und die einzelnen teile in Variabeln speichern. Danach kannst du anhand des jeweiligen Verbs erkennen was getan werden soll und mit dem Attributen  und Objekten in wie es gemacht werden soll. 

Antwort
von MalNachgedacht, 12

ich würde Wortlisten anlegen und jedem Wort eine Zahl zuordnen die angibt wie stark das jeweilige Wort auf Google oder aber auf Musik hindeutet.
z.B. könnte alles was auf Musik hinweist eine positive Zahl zugewiesen bekommen - und alles was auf Google hindeutet eine negative

Wortliste wäre dann in etwa:

Suche  -3
Song +5
Spiele +5

Lied + 5
Google - 10

Für jedes Wort in der Liste prüfst Du nun ob es in der Eingabe vorkommt oder nicht.
Die Werte aller vorkommenen Wörter addierst Du - ist die Summe negativ wird es als Google-Suche bearbeitet - ist sie positiv als Anfrage Musik zu spielen

Geht es um Musik suchst Du in den mp3-Tags jedes Songs nach den Wörtern aus der Eingabe. Für jedes gefundene Wort gibt es wieder Punkte.
Der Song der die meisten Punkte hat wird dann gespielt.

"Spiele Madonna Virgin"

Würde wegen "Spiele" als Musikwunsch bearbeitet.
Wenn dann ein vorhandener Song als Interpret "Madonna" hat und als Songtitel "Like a virgin" dann kassiert dieser Song zwei Bewertungspunkte - und damit vermutlich mehr als jeder andere Song .
Entsprechend würde dann "Like a virgin" gespielt

Manchmal kann man dem Problem auch aus dem Weg gehen - es spricht ja z.B. nichts dagegen trotzdem das Google-Suchergebnis anzuzeigen auch wenn das Programm meint einen Songwunsch vor sich zu haben.

Also im Zweifel sowohl die Musik abspielen als auch die Google-Suchergebnisse anzuzeigen.
Der Nutzer freut sich vielleicht sogar wenn er zusätzlich zum Lied noch ein bisschen Infos von Google bekommt ...

Ob ein Text/Wort in einem anderen Text (String) vorkommt kann man in Java z.B. so prüfen:

int rating=0;

if (anfrage.contains("Song")){

rating=rating+5

}

if (anfrage.contains("Suche")){

rating=rating-3

}

if (anfrage.contains("Spiele")){

rating=rating+5

}

....

if (rating>0){

//Suche bei google

} else {

//Suche nach dem Song der die meisten Wörter aus anfrage enthält

}

Kommentar von regex9 ,

Das würde einen enormen Aufwand bedeuten, zumal mit dem Resultat, ein Programm zu haben, welches fehlerhaft arbeitet. Die Anforderung ist es, dass der Nutzer entscheiden kann, ob z.B. ein Song gespielt oder gesucht wird. Aufgrund seiner Eingabe erwartet er ein bestimmtes Ergebnis, nicht etwas, was sich von Versuch zu Versuch im Verhalten stetig ändern kann. 

Weitere Probleme dieses Lösungsansatzes:

  • Worte könnten in ihrer Wichtungssumme andere Worte (die aber entscheidend sind) aushebeln - so beispielsweise eine Suchanfrage nach einem Song.
  • Das Programm müsste Worte und Beziehungen lernen, was Zeit beansprucht. Die Speicherung und Verwaltung jedes einzelnen Wortes würde mehr und mehr Performance fressen.
  • Worte würden immer wieder ihre Wichtung ändern, je nach Kontext. Irgendwann reicht die Eingabe eines sinnfreien Suchbegriffs (z.B. "und"), um etwas hervorzurufen, was nicht beabsichtigt ist.
Kommentar von MalNachgedacht ,

Das würde einen enormen Aufwand bedeuten, 

Ein paar vorgegebene Schlüsselbegriffe per If statement abzuprüfen - wo ist da ein enormer Aufwand?

zumal mit dem Resultat, ein Programm zu haben, welches fehlerhaft arbeitet. Die Anforderung ist es, dass der Nutzer entscheiden kann, ob z.B. ein Song gespielt oder gesucht wird. 

Kann er ja - indem er entspreche Begriffe wie "Suche" oder "Spiele" verwendet. Nur erlaubt mein System eben verschiedene Varianten und ist ein bisschen flexibler wenn man zusätzliche Schlüsselbegriffe hinterlegt (z.B. satt "Suche" auch "Google"

"Aufgrund seiner Eingabe erwartet er ein bestimmtes Ergebnis, nicht etwas, was sich von Versuch zu Versuch im Verhalten stetig ändern kann. "

Das Verhalten ändert sich doch nicht ständig - eine Eingabe die als Google-Anfrage gewertet wird wird (ohne Änderungen am Programm) auch in der Zukunft stets als Google-Anfrage interpretiert werden

Und umgekehrt für Musikanfragen gilt das gleiche...

"Weitere Probleme dieses Lösungsansatzes:

Worte könnten in ihrer Wichtungssumme andere Worte (die aber entscheidend sind) aushebeln - so beispielsweise eine Suchanfrage nach einem Song."

Richtig: Nur ist ja bei einer Anfrage "Suche Songs von Madonna" selbst für einen Menschen nicht klar, ob da nun bei Google nach Madonno-Songs gesucht werden soll - oder in der vorhandenen MP3-Sammlung.

"Das Programm müsste Worte und Beziehungen lernen, was Zeit beansprucht."

Nö - da Programm lernt gar nichts - es bewertet Begriffe in der Eingabe nach einem simplen vom Programmier vorgegebenen Punktesystem. Entweder fest auskodiert wie oben in meiner Antwort oder in Form einer vorgebenen Wort/Punkte-Liste die in einer Schleife abgearbeitet werden was etwas eleganter wäre als 20 If-Statements

"Die Speicherung und Verwaltung jedes einzelnen Wortes würde mehr und mehr Performance fressen."

Nur werden keine Wörter dauerhaft gespeichert....

"Worte würden immer wieder ihre Wichtung ändern, je nach Kontext."

Erstaunlich was meine paar if-Statement alles können sollen :-)

Nochmal : Die Logik ist nicht lernfähig sondern fest verdrahtet.

Lediglich der zweite Teil - (wenn der Wunsch einen bestimmten Song abzuspielen erkannt wurde) 

dann ist da ein bisschen Dynamik drin weil der gewünschten Song anhand der mp3-Tags bestimmt wird.

Je nachdem welche mp3-Songs auf der Platte liegen könnte das dann zu unterschiedlichen Songs führen die abgespielt werden.

Lautet die Anfrage "Spiele Madonna like a virgin" und der entsprechende Song ist vorhanden würde er wohl die meisten Punkte bekommen und wunschgemäß gespielt werden

Gibt es denn Song aber nicht dafür aber Madonnas "Isla bonita" dann würde wohl der ausgewählt weil er immerhin das Wort "Madonna" enthält.

Ob das nun ein Nach- oder Vorteil ist wenn statt einem nicht vorhandenen Madonna Song "alternativ" zumindest ein anderer Madonna Song gespielt wird ist Geschmackssache....

Ich wüßte jetzt allerdings wie man die Auswahl des gewünschten Songs komfortabler implementieren könnte.
Natürlich kann man verlangen das der Nutzer den exakten Titel und Interpreten eingibt und wenn der nicht gefunden wird dann gar nichts gespielt wird.
Das dürfte in der Praxis wohl weit lästiger und unbequemer sein als meine Methode....

Expertenantwort
von regex9, Community-Experte für Programmierung, 27

Entweder du unterscheidest im UI zwischen 2 Modi (Suche und Abspielen) oder du regelst es wie geplant über die Eingabe. In letzterem Fall gibt es mehrere Lösungsmöglichkeiten. z.B.:

  • Wenn der Eingabestring mit "start" oder mit "search" beginnt, die entsprechende Funktion ausführen und den restlichen String dafür verwenden
  • Ein Trennzeichen festlegen (z.B. einen Doppelpunkt), der Befehl und Suchbegriff voneinander abgrenzt

Keine passende Antwort gefunden?

Fragen Sie die Community