Hallo liebes Forum,
Ich habe folgendes Problem:
Ich habe für ein Programm (Audials) eine Anwendung geschrieben, mit der ich eine Liste mit Künstler + Lied in das Programmspeziefische Format wandeln kann.
Die Funktion auf die meine Anwendung abgestimmt ist, heißt Wunschliste. Die Wunschliste umfasst Künstler + Titel und scannt dann viele Radiosender ob dieses Lied grade abgespielt wird. Soviel zu Audials.
Ich habe bisher meine Anwendung so gestaltet, dass ich eine Liste (import.txt) erstelle mit dem Format:
Künstler1
Titel1
Künstler2
Titel2
[...]
Auf dieses eher außergewöhnliche Format bin ich gestoßen, weil ich nicht dahinter komme wie ich mein eigentliches Format realisieren soll. Dieses wäre:
Künstler1 - Titel1
Künstler2 - Titel2
[...]
Die Liste wird mithilfe einer for-schleife durchlaufen. Zeilenweiße werden dann die Künstler in ein KünstlerArray gepackt und die Lieder in das passende LiederArray. Da ich nur weiß wie ich Zeilenweiße vorgehe weiß ich nicht wie ich meiner Anwendung klar machen soll, dass in Zeile 1 der Künstler in das KünstlerArray[0] soll und der Titel nach dem Strich in LiederArray[0].. und so weiter
Also nochmal expliziet:
Ich möchte, dass in der ersten Zeile das Wort [STRIKE]bis[/STRIKE] zum Strich in das KünstlerArray kommt und das Wort [STRIKE]nach[/STRIKE] dem Strich in das LiederArray und dann eben in die nächste Zeile und das selbe Spiel von vorn.
Wenn der Quelltext das Problem erläutert kann ich ihn dazu schreiben.
Sinnvoller wäre es mit Objekten zu arbeiten Song(Titel, Künstler, Album...) und diese in einer Liste zu halten.
Grundsätzlich kann man eingelesene Texte bzw. Textzeilen ja mit den Methoden der Klasse String analysieren z.B. indexOf(...) und zerlegen substring(int, int). Daneben gibt es auch noch split(...) mit der man einen Inhalte eines String in ein Array packen kann. Problematisch wird es nur wenn
Liegt vllt daran, dass ich noch nicht lange Java lerne..
Nur ob ich jetzt Objekte nehme oder 2 Arrays für Künstler oder Titel ist ja für die aufteilung des Textes relativ oder ?
Gut das der Bindestrich wegfällt, damit kann ich leben. Würde denn eine Trennung durch ein Komma gehen ? Und wie genau würde ich dann die Liste analysieren
Bisher gehe ich die Liste so durch
Java:
publicvoidreader(String name){int minus =1;try{BufferedReader creator =newBufferedReader(newFileReader(""+ name +".txt"));//import.txt wird geladenString zeile =null;for(int i =0;(zeile = creator.readLine())!=null; i++){if(i %2==0){//wenn i geteilt durch 2 keinen Rest ergibt dann soll der Künstler gesetzt werden
kuenstlerArray[i /2]= zeile;//die Division kommt dadurch zustanden, dass die 1, 3, 5, 7 ... Zeile Künstler enthält}else{//ansonsten soll das Lied gesetzt werden
liederArray[i - minus]= zeile;//damit der Array Index vn liederArray zum KünstlerArray passt wurde eine Variable minus angelegt
minus++;}}}catch(IOException e){}}
und schreib dir ne Methode, die dir die Einträge splittet und addet.
in etwa sowas:
Java:
importjava.util.ArrayList;importjava.util.List;publicclassSearchClass{privateList<Entry> entryList;publicSearchClass(){
entryList =newArrayList<Entry>();//Hier Wird einfach eine ArrayList-Instanz erzeugt, die Objekte vom Typ "Entry" aufnehmen kann. (evtl. mal etwas über JavaCollections lesen)}//die folgende Methode rufst du auf, wenn du deine Zeile aus der Datei eingelesen hast und gibst ihr//diese Zeile als String line mit.privatevoidaddEntry(String line){String[] parts = line.split("-");//Hier wird durch die split()-Methode ein StringArray zugewiesen und das "-" entferntif(parts.length ==2){//Hier wird geprüft ob genau 2 Strings im Array liegen sonst weiter beim "else"
entryList.add(newEntry(parts[0].trim(), parts[1].trim()));//Hier wird ein neues Entry-Objekt erzeugt und die beiden Strings aus dem parts-Array im Konstruktor übergeben//danach hast du ein EntryObjekt in der ArrayList, welches per get- und setMethoden den künstler/Titel zurückgibt}else{System.err.println(line +" enthält ungültige angaben!");//Is wohl selbsterklärend}}}
Gruß Vanny
EDIT:// das Beispiel bezieht sich jetzt auf die Struktur "Künstler - Titel"
Die erste Klasse samt Methoden kann ich voll und ganz nachvollziehen, nur die zweite Klasse verstehe ich nicht so ganz, könntest du sie mir etwas genauer erläutern ? Das Problem ist ich lerne Java in der Schule und so weit fortgeschritten sind wir noch nicht, daher versuche ich mir durch solche Anwendungen meine Kentnisse zu erweitern nur so ganz verstehe ich die Klasse SearchClass nicht
So habe schon das erste Problem.. ich versuche nun die Methode addEntry() in meiner Methode reader() aufzurufen..
Erstmal bekam ich die Fehlermeldung, dass addEntry() private ist und ich somit keinen Zugriff habe nun dann habe ich aus private, public gemacht und eine neue Fehlermeldung taucht auf non-static method cannot be referenced from a static context. Keine Ahnung was das heißen soll ..
->
Gelöst, habe ein neues Objekt der Klasse SearchClass erstellt
Das bedeutet, dass deine reader-Methode in einem statischen Kontext steht.
Zeig mal deinen ganzen Code her.
Dir Fehlen auf jeden Fall grundlegende Basics, wenn du nicht weisst, was static heisst und macht.
btw: Ich hab die Klasse SearchClass genannt, weil du den Code auch gut in deine Klasse einbinden könntest, in der auch deine read-Logik steht, dann kannste addEntry() auch wieder private machen.
Ja mir fehlen aufjedenfall noch Grundlagen, dieses Schuljahr war auch das einführende Schuljahr in Java. Wir haben bisher nur Projekte wie Viergewinnt oder ähnliches gemacht, Static oder ähnliches haben wir bisher nie gebraucht.
Java:
package creator2;importjava.io.*;/**
*
* @author Sebastian Grund
* @version 1.0.0.1
* @date 22.Juli.2012
* @copyright by Sebastian Grund
*/publicclassCreator2{int anzLieder;//Anzahl der LiederString kuenstlerArray[];String liederArray[];//Lieder Arrayint stelle =0;FileWriter writer;File file;String dateiname;int lineCount;publicstaticvoidmain(String[] args){Creator2 creator =newCreator2("import");}publicCreator2(String nameZwei){/*auskommentiert, da ich diese Sachen ja nicht brauche bei dem von dir vorgeschlagenen Lösungsweg*//*zeilenCounter(nameZwei);
kuenstlerArray = new String[lineCount / 2];
liederArray = new String[lineCount / 2];
schreiben("export");*/reader(nameZwei);}publicvoideingabe(String kuenstler,String lied){if(liederArray[stelle]==null){for(int i =0; i <1; i++){
kuenstlerArray[stelle]= kuenstler;
liederArray[stelle]= lied;
stelle++;}}else{
stelle++;for(int i =0; i <1; i++){
kuenstlerArray[stelle]= kuenstler;
liederArray[stelle]= lied;
stelle++;}}}publicvoidarrayAusgeben()//Das "aktuelle" Array wird ausgegeben{for(int z =0; z < liederArray.length; z++)//durchlaufen des Arrays; Start bei 0, Ende bei liederArray.Länge{System.out.println(kuenstlerArray[z]+" - "+ liederArray[z]);}}publicvoidschreiben(String dateiname){// File anlegen
file =newFile(""+ dateiname +".A1wish");try{// new FileWriter(file ,true) - falls die Datei bereits existiert// werden die Bytes an das Ende der Datei geschrieben// new FileWriter(file) - falls die Datei bereits existiert// wird diese überschrieben
writer =newFileWriter(file,true);// Text wird in den Stream geschrieben
writer.write("<?xml version='1.0' encoding='UTF-8'?>\n<Exported_Wishes name=\"Creator Export\" version=\"5\" createdby=\"radiotracker\" contenttype=\"artist_track\">\n");for(int y =0; y < liederArray.length; y++){
writer.write("<Wish>\n\t<Artist>"+ kuenstlerArray[y]+"</Artist>\n\t<Track>"+ liederArray[y]+"</Track>\n</Wish>\n\n");}//writer.write(System.getProperty("line.separator"));
writer.write("<Genres>\n\t<Genre>Charts</Genre>\n</Genres>\n\t<Teaser>Creator</Teaser>\n</Exported_Wishes>");// Schreibt den Stream in die Datei// Sollte immer am Ende ausgeführt werden, sodass der Stream // leer ist und alles in der Datei steht.
writer.flush();// Schließt den Stream
writer.close();}catch(IOException e){}}publicvoidreader(String name){int minus =1;try{BufferedReader creator =newBufferedReader(newFileReader(""+ name +".txt"));//import.txt wird geladenString zeile =null;for(int i =0;(zeile = creator.readLine())!=null; i++){addEntry(zeile);}}catch(IOException e){}}publicvoidzeilenCounter(String name){try{BufferedReader creator =newBufferedReader(newFileReader(""+ name +".txt"));String zeile =null;while(creator.readLine()!=null){
lineCount++;}}catch(IOException e){}}}
Künstler: Heino, Titel: Haselnuss.
Künstler: Metallica, Titel: one.
Künstler: Jürgen von der Lippe, Titel: Blumenmann.
Künstler: Fritten und Bier, Titel: Bier am Fuss.
Danke vielmals für diese Lösung. Ich wollte sie grade ausprobieren, nur im Gegensatz zu deinem Ergebnis kommt bei mir bei 6 Liedern in der Liste, 6 mal das letzte Lied sammt Künstler als Ausgabe nicht alle 6 Lieder. Ich hab mal probiert durchzublicken wo der Fehler liegt aber keine Ahnung ich habe nix verändert lediglich die Klasse zu Creator2 umbenannt (natürlich auch den Konstruktor und die anderen Sachen die dadurch umbenannt werden mussten)
Ja wir haben bisher einen Getränkeautomaten erstellt und Viergewinnt. Wie gesagt von static oder ähnlichem hatte ich vorher nie was gehört
Naja mein letzter Code ist ja ausführbar.
Versuch den erstmal unverändert zu starten und bau ihn dann Schritt für Schritt um und teste immer wieder, dann merkste schneller, wenn sich ein Fehler einschleicht.
Da lässt sich eh noch Einiges optimieren.
-Du könntest zBsp. deiner Entryklasse eine Methode verpassen, die den kompletten xml-Eintrag als String zurückgibt.
Java:
publicStringgetXMLLine(){return"<Wish>\n\t<Artist>"+ actor +"</Artist>\n\t<Track>"+ song +"</Track>\n</Wish>\n\n";}
Naja mein letzter Code ist ja ausführbar.
Versuch den erstmal unverändert zu starten und bau ihn dann Schritt für Schritt um und teste immer wieder, dann merkste schneller, wenn sich ein Fehler einschleicht.
das kann ich mir nu auch nicht erklären:noe:
Der einzige Unterschied zu meiner Version ist, dass die import.txt im Projektordner liegt, aber das sollte es nu nich sein.
Du hast in der Entry-Klasse die jeweiligen Strings zu "static" gemacht, und nun siehst du, was static bewirkt: static ist Objektunabhängig und bezieht sich auf die Klasse.
Interessant, genau das war es .. nur wodran hast du jetzt gesehen, dass ich in der entry klasse strings als static hatte, ich hab die doch nirgends hochgeladen oO
habe nun alles so gebaut, dass wieder meine Liste exportiert wird. Funktioniert einwandfrei, danke für die Hilfe und ich werde mir den Quelltext nochmal ganz genau angucken
In deinem Screenshot sind die Methoden kursiv geschrieben und ich hab angenommen, dass es bei deiner IDE genau wie in Eclipse ist: kursiv bedeutet static. Da man von statischen Methoden nur statische Variablen aufrufen kann, müssen die jeweiligen Strings auch static sein.
Außerdem werden die Methoden gelb unterstrichen -> das ist eine "Warnung" (von deiner IDE) : statische Methoden sollten mit Klassenname.Methodenname() aufgerufen werden ( also theoretisch Entry.getActor() ) und nicht mit ReferenzAufObject.MethodenName() , damit GENAU diese Verwechslung nicht auftritt