Vokabeln

Hallo, ich haben einen Vokabel"trainer" und möchte nun eure Verbesserungsvorschläge hören:

Quelltext:
[spoiler]```/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package pkg22vokabeln;

import java.util.Arrays;
import java.util.Comparator;
import javax.swing.JOptionPane;

/**

  • @author CB
    */
    public class Main {

    private static final String[][] vok = {
    {„Sprache: A“, „Sprache: B“},
    {„ccc“, „ddd“},
    {„eee“, „fff“},
    {„ggg“, „hhh“},
    {„iii“, „jjj“},
    {„kkk“, „lll“},
    {„mmm“, „nnn“},
    {„ooo“, „ppp“},
    {„qqq“, „rrr“},
    {„sss“, „ttt“},
    {„uuu“, „vvv“},
    {„www“, „xxx“}
    };
    private static final int[][] iaa = new int[vok.length][2];

    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 (;:wink: {
      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.

bye
TT

Nur mal überflogen:

  • 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).

Ich hab es mal aufgebauscht (vok wird in vok.txt gespeichert, iaa in iaa.txt):

Quelltext:
[spoiler]```/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package pkg22vokabeln;

import java.awt.Toolkit;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;

/**

  • @author CB
    */
    public class Main {

    private static final Pattern pat1 = Pattern.compile("^(.+?) == (.+?)$");
    private static final Pattern pat2 = Pattern.compile("^(\d+?) == (-?\d+?)$");
    private static String[][] vok = {
    {„Sprache A:“, „Sprache B:“},
    {„Reduce 1“, „Shrink Hide Embody“}
    };
    private static int[][] iaa = new int[vok.length][2];

    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 (;:wink: {
      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. :frowning:

[QUOTE=Tomate_Salat]Nur mal überflogen:

  • 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

Gilt natürlich auch für Methoden …

Mal ein Grundaufbau für einen Vokabeltrainer oder sonstiges Programm

/**
* Programeinstieg (keine Programmlogik)
*/
public class Hauptklasse{
public void main(String[] args){
Vokabeltrainer vokabeltrainer=new Vokabeltrainer();
vokabeltrainer.startTrainingsSession();
}
}

/**
* Wirklicher Programmeinstieg (Objektorientiert)
*/
public class Vokabeltrainer {
//..
public void startTrainingsSession(){
//....
}
//..
}

/**
* Vokabel Entität
*/
public class Vokabel{
private String sprace1;
private String sprace2;
//...
}

//.....

Man benötigt keine static Variablen, static Functionen,…
Und es wird leserlicher,…

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 . :frowning:
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…

bye
TT

Schneller können alle Daten gleichzeitig aber auch nicht aus einem DBMS gelesen/abgefragt werden.

[quote=CyborgBeta]Schneller können alle Daten gleichzeitig aber auch nicht aus einem DBMS gelesen/abgefragt werden.[/quote]Richtig.

Aber in der Regel braucht man eben nicht all Datensätze.

Und spätestens wenn man die Daten im Programm ändern möchte ist man mit einer DB besser dran, als selber was Schlaues zu coden…

bye
TT

Ganz weg von der DB…, dort waren doch noch ein paar Fehler drin, die mir erst später aufgefallen sind, ich habe es mal abgeändert:

 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pkg22vokabeln;

import java.awt.Toolkit;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JOptionPane;

/**
 * @author CB
 */
public class Main {

    private static final Pattern pat1 = Pattern.compile("^(.+?) == (.+?)$");
    private static final Pattern pat2 = Pattern.compile("^(\\d+?) == (-?\\d+?)$");
    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 String[][] vok = {
        {"Meine Vokabel 1", "Meine Vokabel 2"},
        {"Meine Vokabel 3", "Meine Vokabel 4..."}
    };
    private static int[][] iaa;

    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]);
        } else {
            System.out.println("Not f.canRead() : " + f);
        }
        iaa = new int[vok.length][2];
        int i = 0;
        for (int[] ia : iaa) {
            ia[0] = i++;
        }
    }

    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");
                iaa = new int[vok.length][2];
                for (int i = 0; i < vok.length; i++) {
                    if (i < alia.size()) {
                        iaa** = alia.get(i);
                    } else {
                        iaa**[0] = i;
                    }
                }
            }
        } 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[] ia : iaa) {
            System.out.println(Arrays.toString(vok[ia[0]]) + " == " + ia[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);
            if (Math.random() < 0.5) {
                String s1 = vok[iaa**[0]][0];
                String s2 = vok[iaa**[0]][1];
                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 + '
' + s1 + " == " + input, "FALSCH", JOptionPane.WARNING_MESSAGE);
                }
            } else {
                String s1 = vok[iaa**[0]][1];
                String s2 = 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, s2 + " == " + s1, "Richtig", JOptionPane.INFORMATION_MESSAGE);
                } else {
                    iaa**[1]++;
                    tk.beep();
                    Thread.sleep(200L);
                    tk.beep();
                    Thread.sleep(200L);
                    tk.beep();
                    JOptionPane.showMessageDialog(null, s2 + " == " + s1 + '
' + input + " == " + s1, "FALSCH", JOptionPane.WARNING_MESSAGE);
                }
            }
            Arrays.sort(iaa, comp); // wichtig
            printVok();
        }
        saveVok();
        saveIaa();
    }
}```

Zeile 39 sagte er ja, entweder static final oder ich initialisiere die Konstante/Variable nicht im static-Block;
wenn ich den static-Block weglasse, dann muss das in loadVok() oder in loadIaa() geschehen, und beide Methoden werden noch länger.
Außerdem ist mir aufgefallen, dass s1 und s2 vertauscht sein können, dann gibt (s1 + " == " + s2) manchmal Sprache B Sprache A und manchmal Sprache A Sprache B zurück.
Außerdem sollte der Benutzer die richtige und falsche Eingabe miteinander vergleichen können, bei falscher Eingabe.
```        iaa = new int[vok.length][2];
        int i = 0;
        for (int[] ia : iaa) {
            ia[0] = i++;
        }```
scheint mir für die Initialisierung von iaa ganz gut. Darin steht 00 10 20 30 40 usw. ... vok gibt es zu jeder Zeit.
Noch kurz was zu `Pattern.compile("^(.+?) == (.+?)$")`: possessive (++) kann keine gültige Zeile finden, greedy (nur +) packt alles bis zum letzten " == " in group(1), reluctant (+?) packt nur alles bis zum ersten " == " in group(1).

Thema von mir aus: done...

*** Edit ***

Gleichstand, "genau so lang wie vok.length, welche Werte drin, egal":
```    private static final int STARTWERT_FUER_NEUE = 2;
    private static int[][] iaa = new int[0][0];

    private static void iniIaa() {
        int[][] iaa2 = new int[vok.length][2];
        for (int i = 0; i < vok.length; i++) {
            if (i < iaa.length) {
                iaa2**[0] = iaa**[0];
                iaa2**[1] = iaa**[1];
            } else {
                iaa2**[0] = i;
                iaa2**[1] = STARTWERT_FUER_NEUE;
            }
        }
        iaa = iaa2;
    }```
Übersichtlich und fix...

Jo, sieht richtig gut aus mit den static Objekten.

Denke auch, das Projekt hat schon Marktreife.

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.

[QUOTE=timbeau]
[…]
Denke auch, das Projekt hat schon Marktreife.[/QUOTE]

Mit solchem Produktivcode sichert man zumindest seinen Arbeitsplatz:
https://www.thc.org/root/phun/unmaintain.html

Wenigstens ein close() in einem finally oder ein try-with-resources Statement darf man doch schon erwarten?

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.

Ich frage mich grade, wie hilfreich Sarkasmus hier ist. Ich komme deswegen mal CBs Bitte nach und mach zu.