/* * Author: pascal Created on 30.03.2005 TODO To change the template for this generated file go to Window - * Preferences - Java - Code Style - Code Templates */ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JTabbedPane; import javax.swing.JMenuBar; import javax.swing.JMenu; import javax.swing.JMenuItem; import java.awt.BorderLayout; import javax.swing.JTextArea; import java.awt.TextArea; import javax.swing.JScrollPane; import java.awt.Font; import java.util.ArrayList; import java.util.Iterator; import java.util.TreeMap; // Idee: aus den loginzeiten des letzten monats lŠsst sich dynamisch die aktuellen chatzeiten errechnen public class SocratesStatistikGui extends javax.swing.JApplet implements ActionListener { //chatter-objekt // datenstruktur fŸr die statistik: // chatter -> tag -> login -> beitrag // ein wort ist alles, was zwischen zwei leerzeichen steht class Beitrag { int uhrzeit; // die einzelne zeile des beitrags int worte; // die anzahl der worte der zeile eines beitrags } class Login { // 2002-10-22 16:06:44 SYSTEM betritt den Chat. int loginUhrzeit;//=> 160644 int logoutUhrzeit; // zu jedem login gehšrt ein logout ... => parallel ArrayList beitrag = new ArrayList(); int getBeitragsWorte(int worte) { for (int i = 0; i < beitrag.size(); i++) { worte = worte + ((Beitrag) beitrag.get(i)).worte; } return worte; } } class Tag { // 2002-10-22 16:06:44 SYSTEM betritt den Chat. int tag; //=> 21022 //liest nur 2000-2009 !! ArrayList logins = new ArrayList(); int getLoginWorte(int worte) { for (int i = 0; i < logins.size(); i++) { worte = ((Login) logins.get(i)).getBeitragsWorte(worte); } return worte; } } class Chatter { // 2002-10-22 16:06:44 SYSTEM betritt den Chat. String name; // => marc int logins; // kšnnte wegfallen. implizit: loginZeit.length. so ist es aber schneller int worte; // speicherplatz fŸr das, was getTagWorte() liefert ArrayList tag = new ArrayList(); int getTagWorte() { int worte = 0; for (int i = 0; i < tag.size(); i++) { worte = ((Tag) tag.get(i)).getLoginWorte(worte); } return worte; } public String print() { // schšnere ausgabe .- benutze courier als font StringBuffer textFormat = new StringBuffer(); StringBuffer textFormat1 = new StringBuffer(" "); for (int i=name.length(); i<10; i++) { textFormat.append(" "); } if (worte/10>0) textFormat1.deleteCharAt(4); if (worte/100>0) textFormat1.deleteCharAt(3); if (worte/1000>0) textFormat1.deleteCharAt(2); if (worte/10000>0) textFormat1.deleteCharAt(1); if (worte/100000>0) textFormat1.deleteCharAt(0); return ( name + textFormat.toString() + String.valueOf(worte) + " "+ textFormat1.toString() + String.valueOf(logins)); } } // wird fŸr die treeMap gebraucht class Kerngruppe { public Kerngruppe(String kerngruppe, int worte) { this.kerngruppe = kerngruppe; this.worte = worte; } String kerngruppe; int worte; public String print() { return (String.valueOf(worte) + " worte: " + kerngruppe); } } int maxTeilnehmer = 100; // !!! teilnehmer auf 100 gesetzt. STATISCH ! Chatter[] chatter; Kerngruppe kernObj; // chatter*chatter Matrix zum speichern der wortBeitragsSchnittmenge int[][] chatterMatrix; // (->kerngruppe) // int[] kerngruppe; //JScrollPane sp1; JScrollPane sp2; JScrollPane sp3; JScrollPane sp4; JScrollPane sp5; // wenn ich wŸ§te, wie drag n drop bzw. copy n paste bei swing geht, kšnnte das ein JTextArea sein TextArea datInpuArea = new TextArea("",23, 1, TextArea.SCROLLBARS_BOTH); JTextArea erzStatArea = new JTextArea(""); JTextArea wemiweArea = new JTextArea(""); JTextArea kerErzArea = new JTextArea(""); JTextArea sta†beArea = new JTextArea(""); JTabbedPane tabbedPane = new JTabbedPane(); JMenuBar menuBar = new JMenuBar(); JMenuItem itemErz = new JMenuItem("Erzeuge Statistische Details"); JMenuItem itemWermitwem = new JMenuItem("Wer chattet mit Wem"); JMenuItem itemKern = new JMenuItem("2er-Kerngruppe finden"); public void init() { // Anlegen der Objekte chatter = new Chatter[maxTeilnehmer]; // wermitwem daten: die chatterMatrix[chatter[x]][chatter[y]] // die x,y Zellen implizieren chatter[x],chatter[y] chatterMatrix = new int[chatter.length][chatter.length]; //ausgabeArea.setContentType("text/html; charset=EUC-JP"); erzStatArea.setEditable(true); // jetzt kann text selektiert werden this.setSize(800, 600); // menu JMenu menu = new JMenu("Verarbeitung"); menu.add(itemErz); menu.add(itemWermitwem); menu.add(itemKern); itemErz.addActionListener(this); itemWermitwem.addActionListener(this); itemKern.addActionListener(this); itemErz.setEnabled(true); itemWermitwem.setEnabled(false); itemKern.setEnabled(false); menuBar.add(menu); // end menu tabbedPane.setSize(800, 660); //in zukunft direkter von socates-ag.de ladbar // vielleicht wird das teil auch schlicht ein server ? mal sehn. // sp1 = new JScrollPane(datInpuArea); sp2 = new JScrollPane(erzStatArea); sp3 = new JScrollPane(wemiweArea); sp4 = new JScrollPane(kerErzArea); sp5 = new JScrollPane(sta†beArea); tabbedPane.addTab("Dateneingabe", datInpuArea); tabbedPane.addTab("Statistische Details", sp2); tabbedPane.addTab("Wer chattet mit Wem", sp3); tabbedPane.addTab("Statistischer †berblick", sp5); tabbedPane.addTab("2er-Kerngruppen", sp4); getContentPane().add(tabbedPane); getContentPane().add(menuBar, BorderLayout.NORTH); erzStatArea.setFont(new Font("Helvetica", Font.PLAIN, 10)); datInpuArea.setFont(new Font("Helvetica", Font.PLAIN, 10)); wemiweArea.setFont(new Font("Helvetica", Font.PLAIN, 10)); kerErzArea.setFont(new Font("Helvetica", Font.PLAIN, 10)); sta†beArea.setFont(new Font("Courier", Font.PLAIN, 12)); String einleitung = new String( "Anleitung:\n Die Eingabe von Daten geschieht momentan nur Ÿber dies Textfenster, in welchem auch der jetzt zu lesende Text steht. Um die Daten einzugeben mŸssen sie exakt so formatiert sein, wie untenstehendes Beispiel verdeutlicht. Wichtig ist z.B. die ersten drei leerzeichen vor den Textzeilen. Die Formatierung ist momentan dadurch zu erreichen dass das komplette Chat-Archiv (oder Teile davon) von den Socrates-Seiten in den Lynx-Browser eingeladen werden. Der Lynx-Browser ist ein reiner Text-Browser und kann als solcher auch gro§e Mengen von Daten (hier: ca. 30 MB) in annehmbarer Zeit (iBook G4: ca. 15 sec.) einladen (Den Lynx-Browser gibt es fŸr alle Betriebssysteme kostenlos im Netz.) Ist das Html-Chat-Archiv in den Lynx-Browser geladen, kann mit dem Tastendruck P die Darstellung des HTML in Ascii ausgeprintet werden. Lynx fragt den Benutzer, ob der Screendump in ein File gespeichert werden soll. Dazu muss vorher ein solches z.B. mit 'touch archiv.txt' erzeugt worden sein. Aus den 30MB Html-Rohdaten werden dann 5MB Ascii. Dieser Ascii-Text wird hoffentlich folgend formatiert aussehen: \n Wenn die Daten also in 'Dateneingabe' eingefŸgt sind (mit copy and paste) kšnnen sie prozessiert werden (zum testen: spŠter im Menu 'Verarbeitung' den Punkt 'Statistik erstellen' auswŠhlen usw.). Der Benutzer wird automatisch zum Reiter 'Statistische Details' geleitet - hier kšnnen jetzt die Ergebnisse betrachtet werden. Wenn im Menu dann 'Wer mit wem' gewŠhlt wird, erscheint im Feld 'Wer mit Wem' eine weitere Verarbeitungsstufe: X hat bei Anwesenheit von Y so-und-soviel Worte geschrieben. Wenn dieser MenŸpunkt ausgewŠhlt wurde, ist automatisch auch das Feld 'Statistischer †berblick' ausgefŸllt (das ist die Funktion, die wohl am hŠufigsten gebraucht werden wird). Zum Anschauen den Reiter 'Statistischer †berblick' manuell anklicken. Die letzte Verarbeitungsstufe ist '2-er Kerngruppe finden': im Feld '2er-Kerngruppe' wird dann sortiert stehen, wieviel X und Y gechattet haben, als sie GLEICHZEITIG eingeloggt waren. Der Unterschied zur vorigen Prozessierungsstufe (die unterm Reiter 'Wer mit Wem' zu sehen ist) ist, das nun nicht mehr gesehen werden kann, WER von den beiden WIEVIEL geschrieben hat. DafŸr ist es Ÿbersichtlicher. Vielleicht verwirrend: Nach 'Wer mit wem' steht z.B.: \nX mit X =120, X mit Y = 100, X mit Z = 40. Vielleicht wŠre zu erwarten gewesen, dass bei X mit X = 140 stŸnde statt 120. Das kommt daher, dass es eine Schnittmenge gegeben hat, wo Y und Z gleichzeitig mit X gechattet haben, und also ein paar Worte (hier: 20) doppelt gezŠhlt werden. Gespeichert wird momentan auch mit der copy and paste Methode. SpŠter sollen einfachere Import/Export Funktionen zugefŸgt werden, auch eine direkte Web-Schnittstelle zum automatischen importieren eines Chat-Archivs. Hinweis: bei der Verarbeitung gro§er Mengen an Daten, insbesondere das EinfŸgen von 5MB Text in das 'Dateneingabe'-Feld, werden einige Ressourcen benštigt. Auch mit einem Gigahertz-Rechner dauert dies ein paar Sekunden !\n 2005, pascal.christoph web.de "); int charLŠnge = 140; for (int i = 0; i < einleitung.length() - charLŠnge; i++) { datInpuArea.append(einleitung.substring(i, i + charLŠnge)); i = i + charLŠnge; if (i > 1150 && i < 1260) { datInpuArea .append("\nDabei wird die erste Zeile Ÿberlesen !!! Hier darf also nichts Wichtiges stehen ... \n 2003-10-03 19:00:26 SYSTEM betritt den Chat.\n 2003-10-03 19:02:26 SYSTEM betritt den Chat.\n 2003-10-03 19:02:36 0 0 0 Hi Andi\n 2003-10-03 19:03:18 0 0 0 Hi, Mam\n 2003-10-03 19:03:51 0 0 0 Na Andi, was machst Du geute noch, oder hast Du\n gestern gemacht?\n 2003-10-03 19:09:27 SYSTEM betritt den Chat.\n 2003-10-03 19:09:34 SYSTEM startet eine Talkrunde. [xml, pdf, rtf]\n 2003-10-03 19:17:34 0 0 0 Was ist los mir dir ???\n 2003-10-03 19:21:34 0 0 0 Andi!!!!!!!!!!!\n 2003-10-03 19:31:14 SYSTEM verlЧt den Chat.\n 2003-10-03 19:31:14 SYSTEM verlЧt den Chat.\n 2003-10-03 19:40:33 SYSTEM betritt den Chat.\n 2003-10-03 20:05:52 SYSTEM verlЧt den Chat.\n 2003-10-03 20:07:14 SYSTEM verlЧt den Chat."); } else while (einleitung.charAt(i) != ' ') { datInpuArea.append(String.valueOf(einleitung.charAt(i))); i++; } datInpuArea.append("\n"); } } public void actionPerformed(ActionEvent ae) { // muss implementiert werden /* * //lade archiv if (ae.getSource() == laden) { } */ //erzeuge statistik und ausgabe auf panel if (ae.getSource() == itemErz) { tabbedPane.setSelectedIndex(1); // zeige Reiter 'Statistik' // reset datenstruktur. notwendig mit array for (int i = 0; i < maxTeilnehmer; i++) { chatter[i] = new Chatter(); } // wermitwem daten: die chatterMatrix[chatter[x]][chatter[y]] chatterMatrix = new int[chatter.length][chatter.length]; computeStatistik(datInpuArea.getText()); StringBuffer ausgabe = new StringBuffer("Logins Chattername:\n"); Tag ta; Login lo; for (int i = 0; i < maxTeilnehmer; i++) { if (chatter[i].name != null) { ausgabe.append("\n======================== \n INSGESAMT " + chatter[i].logins + " Logins von " + chatter[i].name); int a = 0; int b = 0; // von jedem tag ... while (chatter[i].tag.size() > a) { ta = (Tag) chatter[i].tag.get(a); ausgabe.append("\n DATUM: " + ta.tag); //.. alle logins while (ta.logins.size() > b) { lo = (Login) ta.logins.get(b); ausgabe.append(" von:" + lo.loginUhrzeit); int z = 0; // alle beitrŠge der logins while (z < lo.beitrag.size()) { Beitrag be = (Beitrag) lo.beitrag.get(z); ausgabe.append(" " + be.uhrzeit + "=" + be.worte + " worte"); z++; } ausgabe.append(" bis" + lo.logoutUhrzeit); b++; } b = 0; a++; } ausgabe.append("\nINSGESAMT Worte: " + chatter[i].getTagWorte()); } else break; // wenn null, dann ende } erzStatArea.setText(ausgabe.toString()); itemWermitwem.setEnabled(true); itemKern.setEnabled(false); } /* * //speichere statistik if (ae.getSource() == speichere) { } */ //finde, wer mit wem wiviel worte gechattet hat. // eigentlich: der adressat war natŸrlich nicht ermittelbar. nur die schnittmenge // der loginzeit und die dort benutzten worte, die also prinzipiell vom Anderen // lesbar waren if (ae.getSource() == itemWermitwem) { tabbedPane.setSelectedIndex(2); // zeige Reiter 'wer mit wem' wemiweArea.setText(""); // ini der textArea // wermitwem daten: die chatterMatrix[chatter[x]][chatter[y]] // initialisieren.. chatterMatrix = new int[chatter.length][chatter.length]; // alle chatter mit allen chattern vergleichen (=>2d-matrix) for (int ca = 0; ca < chatter.length; ca++) { // chatter b for (int cb = 0; cb < chatter.length; cb++) { // alle tage // ta fŸr chatter a // tb fŸr chatter b for (int ta = 0; ta < chatter[ca].tag.size(); ta++) { for (int tb = 0; tb < chatter[cb].tag.size(); tb++) { //schnittmenge: gemeinsamen tag finden if (((Tag) chatter[ca].tag.get(ta)).tag < ((Tag) chatter[cb].tag .get(tb)).tag) break; // raus aus tb-schleife if (((Tag) chatter[ca].tag.get(ta)).tag == ((Tag) chatter[cb].tag .get(tb)).tag) { // alle logins // la fŸr chatter a // lb fŸr chatter b for (int la = 0; la < ((Tag) chatter[ca].tag.get(ta)).logins .size(); la++) { for (int lb = 0; lb < ((Tag) chatter[cb].tag.get(tb)).logins .size(); lb++) { // alle BeitrŠge // ba fŸr chatter a // bb fŸr chatter b for (int ba = 0; ba < ((Login) ((Tag) chatter[ca].tag .get(ta)).logins.get(la)).beitrag.size(); ba++) { for (int bb = 0; bb < ((Login) ((Tag) chatter[cb].tag .get(tb)).logins.get(lb)).beitrag .size(); bb++) { // Schnittmenge: gemeinsame BeitrŠge finden. // wšrter zŠhlen // if (beitrag.uhrzeit a >= login.uhrzeit b) ... if (((Beitrag) ((Login) ((Tag) chatter[ca].tag .get(ta)).logins.get(la)).beitrag .get(ba)).uhrzeit >= ((Login) ((Tag) chatter[cb].tag .get(tb)).logins.get(lb)).loginUhrzeit) { // if (beitrag.uhrzeit a <= logout.uhrzeit b) if (((Beitrag) ((Login) ((Tag) chatter[ca].tag .get(ta)).logins.get(la)).beitrag .get(ba)).uhrzeit <= ((Login) ((Tag) chatter[cb].tag .get(tb)).logins.get(lb)).logoutUhrzeit) { // speicher schnittmenge, bzw.akkumuliere wert: chatterMatrix[ca][cb] = chatterMatrix[ca][cb] + ((Beitrag) ((Login) ((Tag) chatter[ca].tag .get(ta)).logins .get(la)).beitrag .get(ba)).worte; } break; } } } } } } } } } for (int x = 0; x < chatter.length; x++) { if (chatterMatrix[ca][x] > 0) { wemiweArea.append(chatter[ca].name + " sagt wŠhrend der Anwesenheit von " + chatter[x].name + " insgesamt " + chatterMatrix[ca][x] + " worte \n"); // wenn x sagt zu x : printe auf "Statistischer †berblick" if (chatter[ca].name == chatter[x].name) { chatter[ca].worte = chatterMatrix[ca][x]; } } } // schšnere ausgabenformatierung if (chatter[ca].name!=null) wemiweArea.append("\n"); } // wenn mindestens ein eintrag... if (chatterMatrix.length > 0 && chatterMatrix[0].length > 0) { // schalte menu item frei itemKern.setEnabled(true); itemWermitwem.setEnabled(false); // gib gleichzeitig werte auf "Statistischer †berblick" aus TreeMap map = new TreeMap();// treemaps sind hŸbsch sortiert // map beim zweiten mal prozessieren vorher lšschen // braucht man das ?? while (map.size() > 0) map.remove(map.firstKey()); sta†beArea.setText("DATUM: 200" + String.valueOf(((Tag) (chatter[0].tag.get(0))).tag) + "\nNAME: WORTE: " + "LOGINS:\n========================\n"); // ini der TextArea for (int l = 0; l < chatter.length; l++) { if (chatter[l].name != null) { map.put(chatter[l].name, chatter[l]); } } //Map ausgeben Iterator it = map.values().iterator(); while (it.hasNext()) { sta†beArea.append(((Chatter) it.next()).print() + "\n"); } int gesamtWorte=0; int gesamtLogins=0; for (int i=0; i 0 && chatterMatrix[0].length > 0) { tabbedPane.setSelectedIndex(4); // zeige Reiter '2er-Kerngruppe' kerErzArea.setText(""); // ini der TextArea TreeMap map = new TreeMap(); // map beim zweiten mal prozessieren vorher lšschen // braucht man das ?? while (map.size() > 0) map.remove(map.firstKey()); // zwar Ÿberdimensioniert, aber wat solls int[][] worte = new int[chatterMatrix.length][chatterMatrix.length - 1]; for (int y = 0; y < chatter.length; y++) { for (int i = 1; i < chatter.length - y; i++) { if ((chatterMatrix[y][y + i] + chatterMatrix[y + i][y] > 0)) { worte[y][y + i] = chatterMatrix[y][y + i] + chatterMatrix[y + i][y]; kernObj = new Kerngruppe( (chatter[y].name + "," + chatter[y + i].name), worte[y][y + i]); // ŸberprŸfen, ob der key schon vorhanden. Wenn ja, erhšhe den Wert. // ACHTUNG: dies verŠndert den Wert zwar unzulŠssig, macht es hier aber einfacher // der key wird dann eben gerade im unteren wertebereich, wo es eher zu doppelten // keys kommt, nicht mehr Šquivalent zum kernObj.worte sein. Dieser Wert ist // aber ja noch in der map enthalten (da es ein wert von kernObj ist) und wird // NICHT verfŠlscht while (map.containsKey(new Integer(worte[y][y + i]))) { worte[y][y + i]++; } map.put(new Integer(worte[y][y + i]), kernObj); } } } //Map ausgeben Iterator it = map.values().iterator(); while (it.hasNext()) kerErzArea.append(((Kerngruppe) it.next()).print() + "\n"); itemKern.setEnabled(false); } } // erst umbruch-zeichen finden, dann 25? chars nach vorne "S"(=SYSTEM) suchen, // dann > suchen, danach "be" (=betritt) sonst break, //4 Zeichen zurŸck bis > und solange zurŸckeinlesen in Stringbuffer bis <, // Stringbuffer "drehen" und im Namenarray nach dem Stringbufferinhalt suchen, // und logins++. void computeStatistik(String archiv) { StringBuffer name; //komplett das archiv durchgehen for (int i = 0; i < archiv.length(); i++) { // erst umbruch-zeichen finden, //archiv darf also nicht z.b. mit " 2003-10 ... SYSTEM ..." anfangen, //sonst wŸrde der erste datensatz Ÿberlesen" // da in einer zeile auch chattertext stehen kann, muss die System-zeile identifiziert werden // ausreichen soll die 200 if (archiv.charAt(i) == '\n' && archiv.length() > i + 33 && archiv.charAt(i + 4) == '2' && archiv.charAt(i + 5) == '0' && archiv.charAt(i + 6) == '0') { i = i + 24; // S und < sollte ausreichen,denn vorsicht: es gibt auch text in eigener zeile !! if (archiv.charAt(i) == 'S' && archiv.charAt(i + 7) == '<') { // lesen des loginDatums i = i - 17; // an anfang setzen. liest nur die 2000-2009 !! StringBuffer tag = new StringBuffer(); tag.append(archiv.charAt(i)); tag.append(archiv.charAt(i + 2)); tag.append(archiv.charAt(i + 3)); tag.append(archiv.charAt(i + 5)); tag.append(archiv.charAt(i + 6)); i = i + 8; // Uhrzeit les StringBuffer logUhrzeit = new StringBuffer(); logUhrzeit.append(archiv.charAt(i)); logUhrzeit.append(archiv.charAt(i + 1)); logUhrzeit.append(archiv.charAt(i + 3)); logUhrzeit.append(archiv.charAt(i + 4)); logUhrzeit.append(archiv.charAt(i + 6)); logUhrzeit.append(archiv.charAt(i + 7)); i = i + 17; // Ÿber "SYSTEM" springen, 1. zeichen des namens // 2do: security: nicht das ende des files Ÿberlesen ! name = new StringBuffer(); //lesen des namens while (archiv.charAt(i) != '>') { name.append(archiv.charAt(i)); // name einlesen i++; } i = i + 2;// leerzeichen Ÿberlesen // wenn "betritt": // login anzahl und tag und loginZeit in Chatter erhšhen if (archiv.charAt(i) == 'b') { incLogin(name.toString(), Integer.valueOf(tag.toString()) .intValue(), Integer.valueOf(logUhrzeit.toString()) .intValue()); } // wenn "verlŠsst": // login anzahl und tag und loginZeit in Chatter erhšhen if (archiv.charAt(i) == 'v') { outLogin(name.toString(), Integer.valueOf(logUhrzeit.toString()) .intValue()); } // fehlt noch "startet talkrunde" } //wenn redebeitrag else if (archiv.charAt(i + 1) == '0') { //lesen des loginDatums i = i - 17; // an anfang setzen. liest nur die 2000-2009 !! StringBuffer tag = new StringBuffer(); tag.append(archiv.charAt(i)); tag.append(archiv.charAt(i + 2)); tag.append(archiv.charAt(i + 3)); tag.append(archiv.charAt(i + 5)); tag.append(archiv.charAt(i + 6)); i = i + 8; // Uhrzeit les StringBuffer logUhrzeit = new StringBuffer(); logUhrzeit.append(archiv.charAt(i)); logUhrzeit.append(archiv.charAt(i + 1)); logUhrzeit.append(archiv.charAt(i + 3)); logUhrzeit.append(archiv.charAt(i + 4)); logUhrzeit.append(archiv.charAt(i + 6)); logUhrzeit.append(archiv.charAt(i + 7)); i = i + 19; // Ÿber " 0 0 0" springen name = new StringBuffer(); //lesen des namens while (archiv.charAt(i) != '>') { name.append(archiv.charAt(i)); // name einlesen i++; } i = i + 1;// leerzeichen Ÿberlesen // lese bis zur ende der zeile int wortanzahl = 0; while (i < archiv.length() && archiv.charAt(i) != '\n') { // wortanfang suchen while (archiv.charAt(i) == ' ') { i++; } // wortende suchen bzw. beitragsende while (i < archiv.length() && archiv.charAt(i) != ' ' && archiv.charAt(i) != '\n') { i++; } wortanzahl++; } // neue Zeile mit weiterfŸhrendem redebeitrag ? if (archiv.length() > i + 7 && archiv.charAt(i + 4) != '2' && archiv.charAt(i + 5) != '0' && archiv.charAt(i + 6) != '0') { while (archiv.charAt(i) != '\n') { // wortanfang suchen while (archiv.charAt(i) == ' ') { i++; } // wortende suchen bzw. beitragsende while (archiv.charAt(i) != ' ' || archiv.charAt(i) != '\n') { i++; } wortanzahl++; } } // akkumuliere daten neuerBeitrag(name.toString(), Integer.valueOf(logUhrzeit.toString()) .intValue(), wortanzahl); i--;//da sonst in der forschleife i++, das \n Ÿberlesen wird } } } } // erhšht beim login die variablen in Chatter void incLogin(String name, int tag, int loginUhrzeit) { // namen finden oder neuanlegen for (int i = 0; i < maxTeilnehmer; i++) { if (chatter[i].name != null) { if (chatter[i].name.equals(name)) { chatter[i].logins = chatter[i].logins + 1; //incrementieren //tag finden oder neu anlegen. da chronologisches archiv, letzten eintrag sehen Tag ta; if (chatter[i].tag.size() > 0) { // letzten tag eintrag holen und vergleichen ... ta = (Tag) chatter[i].tag.get(chatter[i].tag.size() - 1); if (tag == ta.tag) { //gefunden Login lo = new Login(); // akkumuliere loginUhrzeit lo.loginUhrzeit = loginUhrzeit; ta.logins.add(lo); } else {// wenn neuer tag Tag taa = new Tag(); taa.tag = tag; Login log = new Login(); log.loginUhrzeit = loginUhrzeit; taa.logins.add(log); chatter[i].tag.add(taa); } return; // gefunden } } } else { chatter[i].name = new String(name); chatter[i].logins = chatter[i].logins + 1; //incrementieren Tag taa = new Tag(); taa.tag = tag; Login log = new Login(); log.loginUhrzeit = loginUhrzeit; taa.logins.add(log); chatter[i].tag.add(taa); return; } } } // trŠgt die logoutUhrzeit in die variablen in Chatter ein void outLogin(String name, int logoutUhrzeit) { // namen finden oder neuanlegen for (int i = 0; i < maxTeilnehmer; i++) { if (chatter[i].name != null) { if (chatter[i].name.equals(name)) { Tag ta; // letzten tag eintrag holen ... ta = (Tag) chatter[i].tag.get(chatter[i].tag.size() - 1); // letzten login des tages holen und aktualisieren ((Login) ta.logins.get(ta.logins.size() - 1)).logoutUhrzeit = logoutUhrzeit; } } } return; // gefunden } // neuer beitrag void neuerBeitrag(String name, int uhrzeit, int wortanzahl) { // namen finden oder neuanlegen for (int i = 0; i < maxTeilnehmer; i++) { if (chatter[i].name != null) { if (chatter[i].name.equals(name)) { Tag ta; // letzten tag eintrag holen ... ta = (Tag) chatter[i].tag.get(chatter[i].tag.size() - 1); // letzten login des tages holen Login lo = ((Login) ta.logins.get(ta.logins.size() - 1)); // Beitrag anlegen Beitrag be = new Beitrag(); be.uhrzeit = uhrzeit; be.worte = wortanzahl; // akkumuliere daten lo.beitrag.add(be); return; } } } return; // gefunden } }