static {
int i = 0;
for (int[] ia : iaa) {
ia[0] = i++;
ia[1] = 0;
}
}
private static final Comparator<int[]> comp = new Comparator<int[]>() { @Override
public int compare(int[] o1, int[] o2) {
return -Integer.valueOf(o1[1]).compareTo(o2[1]);
}
};
/**
@param args the command line arguments /
public static void main(String[] args) {
// TODO code application logic here
for (; {
int i = (int) (Math.random() * 5.0);
boolean b = Math.random() < 0.5;
String s1 = b ? vok[iaa*[0]][0] : vok[iaa**[0]][1];
String s2 = b ? vok[iaa**[0]][1] : vok[iaa**[0]][0];
String input = JOptionPane.showInputDialog(s1);
if (input == null || input.isEmpty()) {
break;
}
if (input.equals(s2) /oder .equalsIgnoreCase()/) {
iaa**[1]–;
JOptionPane.showMessageDialog(null, s1 + " == " + s2, „Richtig“, JOptionPane.INFORMATION_MESSAGE);
} else {
iaa**[1]++;
JOptionPane.showMessageDialog(null, s1 + " == " + s2, „FALSCH“, JOptionPane.WARNING_MESSAGE);
}
Arrays.sort(iaa, comp); // wichtig
for (int[] is : iaa) {
System.out.println(Arrays.toString(vok[is[0]]) + " == " + is[1]);
}
}
for (int[] is : iaa) {
System.out.println(Arrays.toString(vok[is[0]]) + " == " + is[1]);
}
// save…
}
}```[/spoiler]
Fragen: bei Richtig wird ein Fehler inkrementiert, bei Falsch wird ein Fehler dekrementiert,
es wird immer eine Frage aus den fünf am schlechtesten beantworteten Fragen wiederholt,
vok, iaa und comp müssten eigentlich groß,
was sollte ich unter save schreiben (Properties?),
welchen regulären Ausdruck sollte ich anwenden oder wann sind eine Eingabe und s2 „fast gleich“,
JOptionPane messageType: ideal wäre ein rotes Dreieck bei Fehler und ansonsten etwas Grünes?
Weiteres?
PS: Kann ich bei/mit einer TreeMap ein Element aus den fünf oberen Elementen wählen?
[quote=CyborgBeta]welchen regulären Ausdruck sollte ich anwenden oder wann sind eine Eingabe und s2 “fast gleich”,[/quote]Das ist eine schwierige Frage, mit regulären Ausdrücken wirst Du nicht weit kommen. Es wird wohl auf Phonetische Suche hinauslaufen.
Außerdem musst Du Deine Datenstruktur erweiteren, weil auch Synonyme möglich und oft gleichwertig sind.
sprechende Variablennamen und es besteht keine Notwendigkeit diese abzukürzen.
bei deiner aktuellen Datenstruktur kommst du mit properties nicht weit. Eher CSV oder gleich eine Datenbank einsetzen (z.B. H2Database, da diese embedded möglich ist).
static {
int i = 0;
for (int[] ia : iaa) {
ia[0] = i++;
ia[1] = 0;
}
}
private static final Comparator<int[]> comp = new Comparator<int[]>() { @Override
public int compare(int[] o1, int[] o2) {
return -Integer.valueOf(o1[1]).compareTo(o2[1]); // viele Fehler nach Oben
}
};
private static void loadVok() throws IOException {
File f = new File(„vok.txt“);
if (f.canRead()) {
ArrayList<String[]> alsa = new ArrayList<String[]>();
BufferedReader br = new BufferedReader(new FileReader(f));
String line;
while ((line = br.readLine()) != null) {
Matcher m = pat1.matcher(line);
if (m.find()) {
alsa.add(new String[]{m.group(1), m.group(2)});
} else {
System.out.println("Not m.find() : " + line);
}
}
br.close();
vok = alsa.toArray(new String[0][0]);
iaa = new int[vok.length][2];
int i = 0;
for (int[] ia : iaa) {
ia[0] = i++;
ia[1] = 0;
}
} else {
System.out.println("Not f.canRead() : " + f);
}
}
private static void saveVok() throws IOException {
File f = new File(„vok.txt“);
PrintWriter pw = new PrintWriter(new BufferedOutputStream(new FileOutputStream(f)));
for (String[] strings : vok) {
pw.println(strings[0] + " == " + strings[1]);
}
pw.flush();
pw.close();
}
private static void loadIaa() throws IOException {
File f = new File(„iaa.txt“);
if (f.canRead()) {
ArrayList<int[]> alia = new ArrayList<int[]>();
BufferedReader br = new BufferedReader(new FileReader(f));
String line;
while ((line = br.readLine()) != null) {
Matcher m = pat2.matcher(line);
if (m.find()) {
alia.add(new int[]{Integer.parseInt(m.group(1)), Integer.parseInt(m.group(2))});
} else {
System.out.println("Not m.find() : " + line);
}
}
br.close();
if (alia.size() == iaa.length) {
iaa = alia.toArray(new int[0][0]);
} else {
System.out.println(„Not alia.size() == iaa.length“);
}
} else {
System.out.println("Not f.canRead() : " + f);
}
}
private static void saveIaa() throws IOException {
File f = new File(„iaa.txt“);
PrintWriter pw = new PrintWriter(new BufferedOutputStream(new FileOutputStream(f)));
for (int[] ia : iaa) {
pw.println(ia[0] + " == " + ia[1]);
}
pw.flush();
pw.close();
}
private static void printVok() {
for (int[] is : iaa) {
System.out.println(Arrays.toString(vok[is[0]]) + " == " + is[1]);
}
}
/**
@param args the command line arguments /
public static void main(String[] args) throws InterruptedException, IOException {
// TODO code application logic here
loadVok();
loadIaa();
Toolkit tk = Toolkit.getDefaultToolkit();
for (; {
int i = (int) (Math.random() * 5.0);
boolean b = Math.random() < 0.5;
String s1 = b ? vok[iaa*[0]][0] : vok[iaa**[0]][1];
String s2 = b ? vok[iaa**[0]][1] : vok[iaa**[0]][0];
String input = JOptionPane.showInputDialog(s1);
if (input == null) { // Abbrechen gedrückt
break;
}
if (input.equals(s2) /oder .equalsIgnoreCase()/) {
iaa**[1]–;
JOptionPane.showMessageDialog(null, s1 + " == " + s2, „Richtig“, JOptionPane.INFORMATION_MESSAGE);
} else {
iaa**[1]++;
tk.beep();
Thread.sleep(200L);
tk.beep();
Thread.sleep(200L);
tk.beep();
JOptionPane.showMessageDialog(null, s1 + " == " + s2, „FALSCH“, JOptionPane.WARNING_MESSAGE);
}
Arrays.sort(iaa, comp); // wichtig
printVok();
}
saveVok();
saveIaa();
}
}```[/spoiler]
Dazu ein paar Fragen:
Zeile 33 und 37, da sagt er mir, Usage of static non-final variable during initialization
tk.beep(); kann ich nicht einen heftigeren Ton verwenden und unter Linux gibt’s keinen Ton
if (input.equals(s2) /*oder .equalsIgnoreCase()*/) { hilft da die LevenshteinIstanz
Datenbank: Unbedingt notwendig
?
Wie hättet ihr es geschrieben, also ich muss ganz unterschiedliche/verschiedene Sachen lernen, später sollen noch Formeln hinzukommen.
sprechende Variablennamen und es besteht keine Notwendigkeit diese abzukürzen.
bei deiner aktuellen Datenstruktur kommst du mit properties nicht weit. Eher CSV oder gleich eine Datenbank einsetzen (z.B. H2Database, da diese embedded möglich ist).[/QUOTE]
Dem stimme ich voll und ganz zu, das ist alles nur kein schöner leserlicher Code, bin deswegen nicht näher darauf eingegangen.
[QUOTE=CyborgBeta;98836]Ich hab es mal aufgebauscht (vok wird in vok.txt gespeichert, iaa in iaa.txt):
…
Dazu ein paar Fragen:
Zeile 33 und 37, da sagt er mir, Usage of static non-final variable during initialization
[/QUOTE] ja bei deiner static variable in zeile 33 steht ja auch kein final, wenn du es davor schreibst, sollte er nicht mehr meckern
Aber ich würde es anständig in Klassen (OOP) aufteilen, dann brauchst du auch keine static Methoden, static variablen,… und wird auch leserlicher (also der gesamte Code)[QUOTE=CyborgBeta;98836]
tk.beep(); kann ich nicht einen heftigeren Ton verwenden und unter Linux gibt’s keinen Ton
if (input.equals(s2) /*oder .equalsIgnoreCase()*/) { hilft da die LevenshteinIstanz
[/QUOTE]ich würde bei einem Vokabeltrainer kein IgnoreCase verwenden, da man ja wissen will ob er es richtig geschrieben hat und man schreibt im Deutschen “Haus” nunmal so und nicht “hAuS” oder “haus” oder “HAUS” [QUOTE=CyborgBeta;98836]
Datenbank: Unbedingt notwendig
[/QUOTE]notwendig nein, man kann sich auch eigene Ideen machen, eigene Datenstrukturen entwickeln, eigene abfragesprachen ausdenken,… aber einfacher, wartbarer, übersichtlicher wird es durch Verwendung von standarts, wie einer SQL Datenbank, gibt dort auch schöne einfache, die man in einem Desktop Projekt verwenden kann[QUOTE=CyborgBeta;98836]
?
Wie hättet ihr es geschrieben, also ich muss ganz unterschiedliche/verschiedene Sachen lernen, später sollen noch Formeln hinzukommen. :([/QUOTE]
Wie schon gesagt, sprechende Vokabeln, in sprechende Klassen aufgeteilt, viel mehr kann ich dazu nicht sagen, aber mich weiter in den Code zu lesen ist bei einem so unübersichtlichen Code keine freude
Ok, wenn man das mit Objekten oo macht, kann oft noch viel mehr gespeichert werden: Wie oft richtig, falsch, abgefragt usw. Außerdem tun sich neue Fragen auf: Soll bei Objekt, Interface, abstrakte® Klasse erweitert/ vererbt werden oder nicht, wie sollten dann Attribute geschrieben werden; speichert ein Objekt sich selbst oder wird es gespeichert? Das brauche ich alles nicht, also yagni und quick and dirty.
Mich interessiert vielmehr, ob das Speichern O.K. ist, vok.txt muss es nicht vorher geben, wenn es sie doch gibt, kann sie einfach erweitert werden, und egal, in welcher Reihenfolge man loadVok() oder loadIaa() aufruft, der Zustand der Attribute bleibt immer „konsistent“/ wird nicht „korrumpiert“ oder „kompromittiert“. Allerdings kann es bei Manipulation der Indexe(s) eine AIOOBE geben. - Aber ist es ok, immer die 5 am schlechtesten beantworteten Fragen abzufragen? Es ist sehr unwahrscheinlich, dass bei den 5 oberen Elementen und nach 10 Durchläufen 1 Element nicht mindestens 1x abgefragt wird/ wurde. Nicht >=1 heißt ja <1 bzw. 0 .
Nutzt ihr mein Proggi schon für die grauen Zellen?
[QUOTE=CyborgBeta]
Nutzt ihr mein Proggi schon für die grauen Zellen?[/QUOTE]
Ja. Die Speicherung in eine Textdatei finde ich auch sehr flexibel. Reiner Text ist einer DB oder XML/CSV auf jeden Fall vorzuziehen.
Auch jedem Objekt mitzuteilen, wie es gespeichert wird, halte ich für guten Programmierstil. Anstatt einer Klasse die Objekte speichern kann, würde ich das in jedes Objekt packen.
[quote=timbeau]Reiner Text ist einer DB oder XML/CSV auf jeden Fall vorzuziehen.[/quote]So allgemein gesagt ist das auf jeden Fall falsch!
“plain Text” kommt zwar der Lesbakeit entgegen, aber Performanz-techninsch ist dass der absolute Fangschuss!
Für kleinde Datenmengen so um die 10.000 Datensätze ist das uU. noch akzeptabel, aber dannach muss man sich schon was einfallen lassen…
Nur weil jemand sagt, mach das oo, mache ich das nicht extra mit Objekten.
Du widersprichst in #14 deinen eigenen Beitrag #9, so als würde ich Ironie/Sarkasmus/Zynismus nicht erkennen. -.-
Wenn du es verwenden möchtest, dann frag mich nach einer Lizenz und den Preis, so ab 200 Eur ist das sicherlich möglich. -.- So, Thema aber jetzt: done.
Bringt rein gar nix, wenn in loadVok(); loadIaa(); saveVok(); oder saveIaa(); ein Fehler auftritt, wird das Programm ohnehin verlassen. TWR-Statement ist zudem nicht kompatibel mit Java 6. Wieo kommt deine Kritik erst jetzt? Bist du auf einmal neidisch geworden? Es nicht besser können, aber große ****** haben.
Bringe mal einen „Tipp“, der eine wirkliche Verbesserung herbeiführt, ansonsten kann das Thema geschlossen oder gelöscht werden. Dass ich gut bin, weiß ich selber.