Erste Schritte Weblog-Auswertung

Devanther

Top Contributor
Aufgabe:
Ändern Sie die Klasse ProtokollAuswerter so, dass ihr Konstruktor den Namen
der zu analysierenden Protokolldatei übernehmen kann. Dieser
Konstruktor soll den Dateinamen an den Konstruktor der Klasse LogdateiLeser
übergeben. Erzeugen Sie anschließend mit der Klasse LogdateiErzeuger
ihre eigene Datei mit zufälligen Protokolleinträgen und analysieren Sie die Daten.

Klasse: ProtokollAuswerter
Code:
/**
* Eine Klasse, die das Protokoll eines Webservers
* in Hinsicht auf Zugriffe pro Stunde auswertet.
*
* @author David J. Barnes und Michael Kölling.
* @version 31.07.2011
*/
public class ProtokollAuswerter
{
    // Hier werden die Zugriffe für die Stunden gehalten
    private int[] zugriffeInStunde;
    // Verwendung eines LogdateiLesers
    private LogdateiLeser leser;

    /**
     * Erzeuge ein Exemplar, das die Zugriffe in den
     * Stunden eines Tages zählt.
     */
    public ProtokollAuswerter()
    {
        // das Array-Objekt erzeugen, das die Zugriffe
        // in den einzelnen Stunden eines Tages zählt.
        zugriffeInStunde = new int[24];
        // Den Leser für die Logdatei erzeugen.
        leser = new LogdateiLeser();
    }

    /**
     * Analysiere die in der Logdatei erfassten Zugriffsdaten.
     */
    public void analysiereStundendaten()
    {
        while(leser.hasNext()) {
            Logeintrag eintrag = leser.next();
            int stunde = eintrag.gibStunde();
            zugriffeInStunde[stunde]++;
        }
    }

    /**
     * Gib die Anzahl der Zugriffe in den Stunden eines
     * Tages nach Stunden sortiert auf der Konsole aus.
     * Diese Werte sollten zuerst mit einem Aufruf von
     * 'analysiereStundendaten' berechnet werden.
     */
    public void stundendatenAusgeben()
    {
        System.out.println("Stunde: Zugriffe");
        for(int stunde = 0; stunde < zugriffeInStunde.length; stunde++) {
            System.out.println(stunde + ": " + zugriffeInStunde[stunde]);
        }
    }
 
    /**
     * Gib die Zeilen der Logdatei auf der Konsole aus.
     */
    public void logdateiAusgeben()
    {
        leser.datenAusgeben();
    }
}

Klasse: LogdateiLeser
Code:
import java.io.File;
import java.io.FileNotFoundException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Random;
import java.util.Scanner;

/**
* Eine Klasse zum Lesen von Informationen aus einer
* Datei, in der Webseitenzugriffe protokolliert
* sind (eine 'Logdatei').
* Es wird angenommen, dass ein Eintrag in der Logdatei
* Datums- und Zeitinformationen in folgendem Format
* enthält:
*
*   Jahr Monat Tag Stunde Minute
*
* Einträge in der Logdatei sind chronologisch
* aufsteigend sortiert.
*
* @author David J. Barnes und Michael Kölling.
* @version 31.07.2011
*/
public class LogdateiLeser implements Iterator<Logeintrag>
{
    // das Format eines Eintrags in der Logdatei
    private String format;
    // ein "Behälter" für die gelesenen Logeintrag-Objekte.
    private ArrayList<Logeintrag> eintraege;
    // ein Iterator über Einträge
    private Iterator<Logeintrag> dataIterator;
 
    /**
     * Erzeuge einen LogdateiLeser, der Einträge aus einer
     * Logdatei mit dem voreingestellten Namen "weblog.txt"
     * liest.
     */
    public LogdateiLeser()
    {
        this("weblog.txt");
    }
 
    /**
     * Erzeuge einen LogdateiLeser, der Einträge aus einer
     * Datei mit dem angegebenen Namen liest.
     * @param dateiname der Name der Logdatei
     */
    public LogdateiLeser(String dateiname)
    {
        // das Format der Daten
        format = "Jahr Monat(1-12) Tag Stunde Minute";    
        // ein "Behälter" für die Einträge
        eintraege = new ArrayList<Logeintrag>();
     
        // versuchen, den kompletten Inhalt der Datei einzulesen
        boolean datenGelesen;
        try{
            // lokalisieren der Datei in der aktuellen Umgebung
            URL fileURL = getClass().getClassLoader().getResource(dateiname);
            if(fileURL == null) {
                throw new FileNotFoundException(dateiname);
            }
            Scanner logdatei = new Scanner(new File(fileURL.toURI()));
            // lesen der Zeilen bis zum Ende der Datei
            while(logdatei.hasNextLine()) {
                String logzeile = logdatei.nextLine();
                // Zerlegen der Zeile und einfügen in die Eintragsliste
                Logeintrag eintrag = new Logeintrag(logzeile);
                eintraege.add(eintrag);
            }
            logdatei.close();
            datenGelesen = true;
        }
        catch(FileNotFoundException e) {
            System.out.println("Problem entdeckt: " + e);
            datenGelesen = false;
        }
        catch(URISyntaxException e) {
            System.out.println("Problem entdeckt: " + e);
            datenGelesen = false;
        }
        // Wenn wir die Logdatei nicht lesen konnten: Simulationsdaten erzeugen.
        if(!datenGelesen) {
            System.out.println("Lesen der Datei schlug fehl: " +
                               dateiname);
            System.out.println("Es werden nun Simulationsdaten verwendet.");
            erzeugeSimulationsdaten(eintraege);
        }
        // Sort the entries into ascending order.
        Collections.sort(eintraege);
        zuruecksetzen();
    }
 
    /**
     * Hat dieser Leser weitere Einträge zu liefern?
     * @return true falls weitere Daten geliefert werden können,
     *               'false' sonst.
     */
    public boolean hasNext()
    {
        return dataIterator.hasNext();
    }
 
    /**
     * Liefere den nächsten Eintrag aus der Logdatei
     * in Form eines Logeintrag-Objektes.
     *
     * @return ein Exemplar von Logeintrag, das die Daten
     *          der nächsten Zeile enthält.
     */
    public Logeintrag next()
    {
        return dataIterator.next();
    }
 
    /**
     * Lösche einen Eintrag
     * Diese Operation ist nicht erlaubt.
     */
    public void remove()
    {
        System.err.println("Das Löschen von Einträgen ist nicht erlaubt.");
    }
 
    /**
     * @return einen String, der das Format der Daten in der Protokolldatei erklärt.
     */
    public String gibFormat()
    {
        return format;
    }
 
    /**
     * Setze den logischen Lesezeiger wieder an den Anfang
     * der Daten dieses LogdateiLesers. Die Daten können auf
     * diese Weise mehrfach ausgelesen werden.
     */
    public void zuruecksetzen()
    {
        dataIterator = eintraege.iterator();
    }
 
    /**
     * Gib die Daten dieses Lesers auf die Konsole aus.
     */
    public void datenAusgeben()
    {
        for (Logeintrag eintrag : eintraege) {
            System.out.println(eintrag);
        }
    }

    /**
     * Liefere einen Satz von Simulationsdaten.
     * Nebenbemerkung: Um die Erzeugung hier zu vereinfachen,
     * werden keine Tage über den 28sten eines Monats hinaus
     * generiert.
     * @param daten 'Behälter', in dem die erzeugten Daten
     *              abgelegt werden sollen.
     */
    private void erzeugeSimulationsdaten(ArrayList<Logeintrag> daten)
    {
        // Für jede Dateneinheit (Jahr, Monat, Tag, Stunde, Minute)
        // wird hier der Minimalwert angegeben.
        int[] minimum = { 2006, 1, 1, 0, 0, };
        // Für jede Dateneinheit (Jahr, Monat, Tag, Stunde, Minute)
        // wird hier der gültige Wertebereich angegeben (man beachte,
        // dass für die Tage nur Werte bis 28 gültig sind, um die
        // Erzeugung ungültiger Daten zu vermeiden).
        int[] bereich = { 3, 12, 28, 24, 60 };
        // Wähle einen festen Basiswert für die Erzeugung der
        // Zufallszahlen, damit das Ergebnis reproduzierbar ist.
        Random zufall = new Random(12345);
        // Eine simulierte Zeile wird mit einem StringBuffer gebildet.
        StringBuffer zeile = new StringBuffer();
        // Anzahl der simulierten Zeilen
        int anzahlZeilen = 100;
        // die Anzahl der Dateneinheit pro Zeile
        int einheitenProZeile = minimum.length;
        for(int i = 0; i < anzahlZeilen; i++) {
            for(int j = 0; j < einheitenProZeile; j++) {
                int wert = minimum[j]+zufall.nextInt(bereich[j]);
                zeile.append(wert);
                zeile.append(' ');
            }
            // Konvertiere die Zeile in einen Logeintrag.
            Logeintrag entry = new Logeintrag(zeile.toString());
            daten.add(entry);
            zeile.setLength(0);
        }
    }
}

Klasse: LogdateiErzeuger
Code:
import java.io.*;
import java.util.*;

/**
* Eine Klasse zum Erzeugen von Logdatei mit zufälligen Daten.
*
* @author David J. Barnes und Michael Kölling.
* @version 31.07.2011
*/
public class LogdateiErzeuger
{
    private Random zufallsgenerator;

    /**
     * Erzeuge Logdateien.
     */
    public LogdateiErzeuger()
    {
        zufallsgenerator = new Random();
    }
  
    /**
     * Erzeuge eine Datei mit zufälligen Logeinträgen.
     * @param dateiname die Datei, in die geschrieben werden soll.
     * @param anzahlEintraege wie viele Einträge.
     * @return true wenn erfolgreich, ansonsten false .
     */
    public boolean erzeugeDatei(String dateiname, int anzahlEintraege)
    {
        boolean erfolg = false;
      
        if(anzahlEintraege > 0) {
            try {
                FileWriter writer = new FileWriter(dateiname);
                Logeintrag[] eintraege = new Logeintrag[anzahlEintraege];
                for(int i = 0; i < anzahlEintraege; i++) {
                    eintraege[i] = erzeugeEintrag();
                }
                Arrays.sort(eintraege);
                for(int i = 0; i < anzahlEintraege; i++) {
                    writer.write(eintraege[i].toString());
                    writer.write('\n');
                }
              
                writer.close();
                erfolg = true;
            }
            catch(IOException e) {
                System.err.println("Es gab ein Problem beim Schreiben in " + dateiname);
            }
              
        }
        return erfolg;
    }
  
    /**
     * Erzeuge einen einzelnen (zufälligen) Eintrag für eine Logdatei.
     * @return Ein Logeintrag mit zufälligen Daten.
     */
    public Logeintrag erzeugeEintrag()
    {
        int jahr = 2011;
        int monat = 1 + zufallsgenerator.nextInt(12);
        // umgehe die Komplexität einer exakten Tage-im-Monat-Berechnung
        int tag = 1 + zufallsgenerator.nextInt(28);
        int stunde = zufallsgenerator.nextInt(24);
        int minute = zufallsgenerator.nextInt(60);
        return new Logeintrag(jahr, monat, tag, stunde, minute);
    }

}

Erstens eine neue Klasse, Protokolldatei erzeugen?
 

thecain

Top Contributor
Nein, du musst keine neue Klasse anlegen, lies doch die Aufgabe, die ist ziemlich einfach.

Konstruktor den Namen
der zu analysierenden Protokolldatei übernehmen kann
/**
* Erzeuge eine Datei mit zufälligen Logeinträgen.
* @param dateiname die Datei, in die geschrieben werden soll.
* @param anzahlEintraege wie viele Einträge.
* @Return true wenn erfolgreich, ansonsten false .
*/
public boolean erzeugeDatei(String dateiname, int anzahlEintraege)

Diese zwei Stellen sollten dir auf die Sprünge helfen. Sonst sind da soooo viele Kommentare, die stehen da nicht zum Spass.

Zudem ich zweifle immer mehr an der Didaktik von dem Buch. (Und dieser deutsche Quellcode macht mir Augenschmerzen (gibFormat... was zur Hölle)). Da kannst du aber nichts für.
 

Joose

Top Contributor
Darf man fragen warum du mit der nächsten Aufgabe anfängst obwohl die vorherigen (https://www.java-forum.org/thema/artikelbestand.178257/page-12#post-1129342) noch nicht gelöst wurden?
Mich wundert es nicht dass du dir schwer tust die Aufgaben alleine zu lösen! Du fängst anscheinend wirklich neue Kapitel an ohne dass die bisherigen verstanden wurden und deren Aufgaben gelöst wurden. Bei den Folgekapiteln fehlen dann benötigte Grundlagen ....

Nimm doch den Rat an und lerne Java nicht mittels BlueJ (wunderbar um gewisse Dinge zu vermitteln oder in die Programmierung reinzuschnuppern, aber ernsthaft Java lernen kann man damit meiner Meinung nach nicht). Verwende ein anderes Buch oder Tutorials/Bücher aus dem Internet es gibt so viele.
 

Devanther

Top Contributor
Also der Konstruktor von ProtokollAuswerter soll an den Konstruktor der Klasse LogdateiLeser
den Dateinamen, übergeben. Welchen Dateinamen?
ohman, ich lese das schon zum 100sten Mal durch.

Wie gebe ich etwas von Konstruktor zu Konstruktor weiter, sowas habe ich noch nie gemacht.
 

Joose

Top Contributor
Da steht nirgends dass du etwas von Konstruktor zu Konstruktor übergeben sollst.

Du sollst mit Hilfe der Klasse LogdateiErzeuger eine neue Logdatei (kein Java Objekt sondern eine richtige Datei auf deiner Festplatte ;)) erzeugen! Den Namen (bzw. den Pfad) dieser Datei sollst du an den Konstruktor von ProtokollAuswerter übergeben.

Ich bleibe immer noch bei der Ansicht dass du zuerst die anderen Aufgaben lösen und verstehen solltest bevor du die nächsten anfängst, so wirst du nie etwas richtig lernen. Aber solche Anmerkungen werden von dir gekonnt ignoriert.
 

Devanther

Top Contributor
Ich bin durch die Aufgabenstellung total verwirrt.
Ich verstehe nicht, was gemacht werden soll.
Was ist der 1. Schritt?
Du sollst mit Hilfe der Klasse LogdateiErzeuger eine neue Logdatei (kein Java Objekt sondern eine richtige Datei auf deiner Festplatte ;)) erzeugen! Den Namen (bzw. den Pfad) dieser Datei sollst du an den Konstruktor von ProtokollAuswerter übergeben

Wie mache ich das? Das habe ich noch nie gemacht...

mit zufälligen Protokolleinträgen und analysieren Sie die Daten.
Welche Protokolleinträge sollen das sein?
 
Zuletzt bearbeitet:

Meniskusschaden

Top Contributor
Ich bin durch die Aufgabenstellung total verwirrt.
Du solltest vielleicht mal die Konsequenz daraus ziehen. Was ist wohl der sinnvolle Entschluß, wenn man ständig wegen mangelnder Grundlagenkenntnisse scheitert: Weiter vorangehen, um sich mit immer schwierigeren Aufgaben zu beschäftigen? Oder lieber zurück gehen, und die Grundlagen so lange wiederholen, bis man sie verstanden hat?
 

Devanther

Top Contributor
Ja, die Aufgabenstellung ist echt schlimm!
Step by Step komm ich schon weiter...
Es ist auch so, dass in jeder Aufgabe etwas anderes gefordert wird.
Selbst mit meinem bisherigen Wissen komme ich hier nicht weiter.
 

Meniskusschaden

Top Contributor

Harry Kane

Top Contributor
1. Überlege dir einen String, der einen Pfad zu einer Datei darstellt.
2. Erzeuge eine Instanz von LogdateiErzeuger, und rufe deren Methode erzeugeDatei auf. Erster Parameter ist der String aus 1., zweiter Parameter ein von dir definierter int (Vorschlag: 10)
Bis jetzt musst du keine Klassen ändern, sondern nur vorhandene nutzen.
3. Der Klasse ProtokollAuswerter einen Konstruktor hinzufügen, der einen String als Parameter bekommt. In dem Konstruktor initialisierst du zugriffeInStunde = new int[24] und leser = new LogdateiLeser(stringParameterAusDemKonstruktor);
4. Wenn die erzeugeDatei-Methode (aus Schritt 2) true zurückgibt, kannst du mit dem String aus 1. den neuen Konstruktor von ProtokollAuswerter (mit dem String-Parameter) aufrufen.
Das müsste es sein.

[Edit] Waaaah! Was mache ich hier gerade?
 

Devanther

Top Contributor
1. Überlege dir einen String, der einen Pfad zu einer Datei darstellt.
"Sebastian"

2. Erzeuge eine Instanz von LogdateiErzeuger, und rufe deren Methode erzeugeDatei auf. Erster Parameter ist der String aus 1., zweiter Parameter ein von dir definierter int (Vorschlag: 10)
Bis jetzt musst du keine Klassen ändern, sondern nur vorhandene nutzen.

Hab ich.
3. Der Klasse ProtokollAuswerter einen Konstruktor hinzufügen, der einen String als Parameter bekommt. In dem Konstruktor initialisierst du zugriffeInStunde = new int[24] und leser = new LogdateiLeser(stringParameterAusDemKonstruktor);

Code:
 public ProtokollAuswerter(String Sebastian)
    {
        // das Array-Objekt erzeugen, das die Zugriffe
        // in den einzelnen Stunden eines Tages zählt.
        zugriffeInStunde = new int[24];
        // Den Leser für die Logdatei erzeugen.
        leser = new LogdateiLeser(Sebastian);
    }

So?

4. Wenn die erzeugeDatei-Methode (aus Schritt 2) true zurückgibt, kannst du mit dem String aus 1. den neuen Konstruktor von ProtokollAuswerter (mit dem String-Parameter) aufrufen.
Das müsste es sein.

True wird immer zurückgeliefert.
 

Devanther

Top Contributor
Vervollständigen Sie die folgende Methode anzahlZugriffe, die die Gesamtzahl aller Zugriffe berechnet, die
in der Logdatei protokolliert sind. Benutzen Sie eine for-Schleife, die über zugriffeInStunde iteriert.
/**
*Liefere die Anzahl aller Zugriffe, die in der Logdatei protokolliert sind.
*/
public int anzahlZugriffe()
{
int gesamt = 0;
//Addiere den Wert jedes Elements in zugriffeInStunde
// zu gesamt hinzu.

........
return gesamt;
}

Die Methode in der Klasse ProtokollAuswerter?
Welche Logdatei?
Welche Zugriffe?
Erstmal muss ich wissen, WAS überhaupt gemacht werden soll.

Da haben wir schonmal iteriert und alle Details ausgeben lassen.
Code:
public void alleArtikelAnzeigen()
{
   for(Artikel aktuellerArtikel: lager){
    System.out.println(aktuellerArtikel.toString());
}

und mit gesamt++ wird addiert
 
Zuletzt bearbeitet:

thecain

Top Contributor
Ist das ein Gemeinschaftsprojekt geworden?

//Addiere den Wert jedes Elements in zugriffeInStunde
// zu gesamt hinzu.
ist doch klar, oder nicht?

Bilde die Summe aus allen Werten in dem Array...

Ich sehe immer weniger Eigenleistung, immer nur die nächste Aufgabe, direkt gepostet, ohne irgendwelche Versuche? Du willst doch etwas lernen, wenn es dir schwerer fällt, musst du halt mehr Zeit investieren, oder alternative Ressourcen zu Rate ziehen um zu Lernen. Momentan wird dir einfach nur alles vorgekaut, was offensichtlich zu nichts führt.

Im Internet gibt es viele Einsteiger Java Kurse. z.B. https://de.udacity.com/course/java-programming-basics--ud282/
oder: https://in.udacity.com/course/intro-to-java-programming--cs046/

Im zweiten wird sogar BlueJ verwendet, wenn du das unbedingt verwenden willst.
 

Devanther

Top Contributor
Ja, ich kann jetzt die kostenlosen Java Videos sehen.
Dass das auf English ist, ist nicht so tragisch.
BlueJ gibts da aber nun nicht?
 

Joose

Top Contributor
Schaue dir die Videos an übe die Grundlagen und probiere dich später selber an der Aufgabe!
Wenn du selber merkst die Aufgaben sind dir zu schwer oder dir fehlt Wissen um diese Aufgabe zu lösen, dann musst du dir dieses Wissen aneignen und üben. In diesem Fall musst du eben die Kapiteln vor der Aufgabe nochmals durcharbeiten und wiederholen bist du die Aufgabe lösen kannst.
 

Devanther

Top Contributor
Ich habe mir alle Videos angesehen in den letzen Tagen, aber die Videos waren nicht sehr gut und
es bringt mich bei dieser Aufgabe leider nicht weiter.

Das ist die Aufgabe:
Vervollständigen Sie die folgende Methode anzahlZugriffe, die die Gesamtzahl aller Zugriffe berechnet, die
in der Logdatei protokolliert sind. Benutzen Sie eine for-Schleife, die über zugriffeInStunde iteriert.
/**
*Liefere die Anzahl aller Zugriffe, die in der Logdatei protokolliert sind.
*/
public int anzahlZugriffe()
{
int gesamt = 0;
//Addiere den Wert jedes Elements in zugriffeInStunde
// zu gesamt hinzu.

........
return gesamt;
}
Und auf der letzen Seite, stehen meine Gedanken zu der Aufgabe.
Scheinbar muss diese Methode in die Klasse Protokollauswerter eingefügt werden.
Ich weiss jetzt nicht, welche Logdatei und welche Zugriffe gemeint sind.
Man iteriert mit einer for-Schleife über zugriffeInStunde und addiert dann immer ein Element zu gesamt eins hinzu;
gesamt++

Kann mir da jemand helfen?
Das BlueJ Buch oder die Videos sind leider keine Hilfe.
 

Joose

Top Contributor
zugriffeInStunde ist ein Array mit einer Länge von 24. Für jede Std stehen dort die Anzahl der Zugriffe drinnen!
Du sollst über dieses Array iterieren und den Wert des jeweiligen Index zu gesamt dazuaddieren.
 

Devanther

Top Contributor
Code:
public int anzahlZugriffe()
{
for(Zugriffe aktuellerZugriff: zugriffeInStunde){
int gesamt = zugriffeInStunde++;

return gesamt;
}
}

Das ist wahrscheinlich falsch -.-
 

Joose

Top Contributor
Ist es ... du deklarierst in der Schleife jedes mal eine neue Variable "gesamt", diese existiert beim nächsten Schleifendurchlauf nicht mehr. Abgesehen davon steht das "return" innerhalb der Schleife, somit wird die Schleife und Methode nach dem 1.Durchlauf verlassen!
Abgesehen davon ist die for-Schleife nicht richtig. Von welchem Typ ist das Array "zugriffeInStunde"? Vom Typ "Zugriffe" oder "int"?

Wieder die Aufforderung von mir: gehe bis an den Anfang des Buches zurück und fange nochmal von vorne an! Die einfachsten Grundlagen sitzen bei dir nicht, so wirst du nicht ans Ziel kommen (ohne dass es dir wer vorkaut!)
 

Harry Kane

Top Contributor
Von welchem Typ ist das Array "zugriffeInStunde"? Vom Typ "Zugriffe" oder "int"?
Ist eigentlich egal. In keinem Fall kann der Inkrement-Opersator verwendet werden.
Java:
public int anzahlZugriffe(){
    for(Zugriffe aktuellerZugriff: zugriffeInStunde){
        int gesamt = zugriffeInStunde++;
        return gesamt;
    }
}
Das ist wahrscheinlich falsch -.-
Ich würde eher sagen, es ist noch nicht einmal falsch.
Du programmierst nicht, du schreibst einen Text hin, der einem Text ähnelt, den dir jemand anders bei ähnlichen Schlagworten schon mal hingeschrieben hat. Ich sehe null Verstehen für das was du da tust. So wird das nichts.
 

Devanther

Top Contributor
Ok. Was ist der 1ste Schritt um zu einer Lösung zu kommen?

Code:
public int anzahlZugriffe()
{
for ( int i = 1; i < zugriffeInStunde; i++ ) // i ist Schleifenzähler
System.out.println( i );

int gesamt = i++;
//Addiere den Wert jedes Elements in zugriffeInStunde
// zu gesamt hinzu.

return gesamt;
}


Ist wieder falsch.
 

Meniskusschaden

Top Contributor
Ok. Was ist der 1ste Schritt um zu einer Lösung zu kommen?
Die Grundlagen lernen. Du hast bisher offenbar noch gar nichts gelernt und musst bei Null beginnen. Aktuell verfügst du über keinerlei Java-Kenntnisse. Deshalb hat es keinen Sinn, mit dieser Aufgabe fortzufahren. Wenn dir hier Tipps wie "Buch lesen" oder "Video ansehen" gegeben werden, ist damit nicht gemeint, sie passiv zu konsumieren, sondern aktiv durchzuarbeiten. Du solltest erst dann zur nächsten Seite übergehen, wenn du die vorige vollständig verstanden hast.

Deine Lösungsvorschläge aus Post #17 und Post #26 sind identisch. Du hast also nicht einmal den Versuch gemacht, einen Fehler zu korrigieren. Der Vorschlag aus Post #30 ist ebenso falsch. Die Vorschläge sind auch nicht nur ein bisschen falsch, sondern es ist gar nicht nachvollziehbar, warum du sie überhaupt für denkbare Lösungen hältst. Du hast offenbar gar keine Vorstellung davon, wie ein Java-Programm abgearbeitet wird. Wenn du anfängst die Grundlagen zu lernen, solltest du dir deshalb möglichst bald angewöhnen, einen Schreibtischtest zu machen.

Hier ist nochmal dein Vorschlag aus Post #17 bzw. #26:
Java:
public int anzahlZugriffe() {
    for (Zugriffe aktuellerZugriff : zugriffeInStunde) {
        int gesamt = zugriffeInStunde++;
        return gesamt;
    }
}
Um dir bei der Aufgabe weiter helfen zu können, solltest du folgende Fragen beantworten:
  1. Was ist in der Schleife for(A b:c) {...} jeweils die Funktion von A, b und c?
  2. Was bewirkt der Operator++?
  3. Was für eine Variable istzugriffeInStunde?
  4. Was erhoffst du dir als Ergebnis des AusdruckszugriffeInStunde++?
  5. Warum hast du die Anweisungreturn gesamt; dort platziert, wo sie jetzt steht und nicht irgendwo anders?
  6. Was bewirkt die Anweisung return gesamt; überhaupt? Welche Konsequenz hat sie für die Methode, in der die Anweisung ausgeführt wird?
  7. Warum hast du die Variable gesamt dort deklariert, wo sie jetzt steht und nicht irgendwo anders?
 

Devanther

Top Contributor
1. Also B ist die sogenannte "Schleifenvariable". Ihr werden nacheinander die Werte aus der Liste C
zugewiesen. Die Schleifenvariable also B, kann jeden beliebigen Namen haben.
C ist sozusagen die Liste, die Elemente enthält.
A, der Typ der Schleifenvariablen muss übereinstimmen mit C.
Wenn A ein String ist, muss auch C ein String sein.

2. Der Operator ++ bedeuet = +1

3. zugriffeInStunde ist die Liste die durchlaufen wird.

Und der Rest ist wohl ziemlich falsch.
 

Devanther

Top Contributor
4. Naja, dass in zugriffeInStunde halt immer 1 zuaddiert wird.
5./6. return gesamt müsste falsch plaziert sein. Wenn return gesamt erreicht wird, wird die
Schleife abgebrochen und nicht erneut ausgeführt.
Müsste also nach der geschweiften Klammer platziert werden.
return bedeutet, dass etwas zurückgegeben wird.
Und da diese Methode ungleich void müsste return schon irgendwo stehen.

7. Weil jedes Mal wenn über zuGriffeInStunde iteriert wird, 1 hinzuaddiert werden soll.
Ich nehme an, dass sich gesamt in den geschweiftet Klammern befinden muss.

Die Schleifenvariable ermöglicht nacheinander Zugriff auf jedes Element in der Sammlung.
 

Meniskusschaden

Top Contributor
1. Also B ist die sogenannte "Schleifenvariable". Ihr werden nacheinander die Werte aus der Liste C
zugewiesen. Die Schleifenvariable also B, kann jeden beliebigen Namen haben.
C ist sozusagen die Liste, die Elemente enthält.
A, der Typ der Schleifenvariablen muss übereinstimmen mit C.
Wenn A ein String ist, muss auch C ein String sein.
@Joose hat das ja schon korrigiert. A muss nicht zu c passen, sondern zu den Elementen die in c gespeichert sind. Welchen Datentyp haben denn die Elemente, die in zugriffeInStunde gespeichert sind? Welchen Datentyp muss in deiner Schleife also die Schleifenvariable haben?

2. Der Operator ++ bedeuet = +1

3. zugriffeInStunde ist die Liste die durchlaufen wird.
4. Naja, dass in zugriffeInStunde halt immer 1 zuaddiert wird.
Angenommen, du hast folgende Daten in zugriffeInStunde (ich tue jetzt mal so, als hätte ein Tag nur drei Stunden):
Code:
Stunde 0: 4
Stunde 1: 5
Stunde 2: 7
Wieviele Zugriffe gab es dann insgesamt? Bringt dich die Addition um 1 weiter? Und was soll es überhaupt bedeuten, 1 zu einer Liste zu addieren? Könntest du das manuell machen?
5./6. return gesamt müsste falsch plaziert sein. Wenn return gesamt erreicht wird, wird die
Schleife abgebrochen und nicht erneut ausgeführt.
Müsste also nach der geschweiften Klammer platziert werden.
return bedeutet, dass etwas zurückgegeben wird.
Und da diese Methode ungleich void müsste return schon irgendwo stehen.
Das ist alles richtig beschrieben. Die return-Anweisung gehört also hinter die Klammer, damit sie erst ausgeführt wird, wenn die Schleife vollständig abgearbeitet wurde.
7. Weil jedes Mal wenn über zuGriffeInStunde iteriert wird, 1 hinzuaddiert werden soll.
Ich nehme an, dass sich gesamt in den geschweiftet Klammern befinden muss.
Wenn du sie innerhalb der geschweiften Klammern deklarierst, ist sie auch nur dort gültig. Wenn du sie nur dort benötigst, ist das in Ordnung. An welchen Stellen benötigst du sie denn? Kümmere dich aber vorher um 5./6..
 

Devanther

Top Contributor
Welchen Datentyp haben denn die Elemente, die in zugriffeInStunde gespeichert sind? Welchen Datentyp muss in deiner Schleife also die Schleifenvariable haben?

Int

Wieviele Zugriffe gab es dann insgesamt? Bringt dich die Addition um 1 weiter? Und was soll es überhaupt bedeuten, 1 zu einer Liste zu addieren? Könntest du das manuell machen?

Es gab dann insgesamt 16 Zugriffe, nein die Addition mit 1 bringt mich nicht ans Ziel.

Wie soll ich denn jetzt den Code schreiben?
 

Joose

Top Contributor
So wie in der Aufgabe verlangt ;)
Laut deiner Aussage hast schon alle möglichen Videos und Bücher durchgearbeitet ... die Grundlagen um den Code selber zu schreiben sollten also vorhanden sein.
Probiere es selber und gehe dabei Schritt für Schritt vor. Schreibe zuerst die Methode welche einfach einen Wert zurückgibt, dann füge in diese Methode eine Schleife ein welche über die Elemente deines Arrays iteriert.
usw.
 

Devanther

Top Contributor
Ohne Hilfe bekomm ich das nicht hin. Aus meinen Büchern kann ich die Lösung nicht ableiten.

Code:
public int anzahlZugriffe() {
    for (Int aktuellerZugriff : zugriffeInStunde) {
        int gesamt = zugriffeInStunde++;
}      
return gesamt;
    }
}
 

mrBrown

Super-Moderator
Mitarbeiter
Ohne Hilfe bekomm ich das nicht hin. Aus meinen Büchern kann ich die Lösung nicht ableiten.

Code:
public int anzahlZugriffe() {
    for (Int aktuellerZugriff : zugriffeInStunde) {
        int gesamt = zugriffeInStunde++;
}     
return gesamt;
    }
}
Doch - solltest du können.
Und wenn nicht, dann kannst du zumindest die Fehler in deinem Code Stück erkennen (hast du schließlich hier schon alle beschrieben) und auch beheben.
 

Devanther

Top Contributor
In der Methode public int anzahlZugriffe() selbst werden keine Fehler angezeigt.
Dafür kommen aber in den anderen Methoden Fehlermeldungen -.-
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Erste Schritte Warum misslingt die Auswertung des ersten Aufrufparameters? Java Basics - Anfänger-Themen 4
topi Parentabfrage, danach "if"-Auswertung Java Basics - Anfänger-Themen 3
T Operatoren Seiteneffekte bei Auswertung von Ausdrücken Java Basics - Anfänger-Themen 9
D statistische Auswertung Java Basics - Anfänger-Themen 1
C Auswertung Ausdruck mit Punknotation + Objekt als Parameter Java Basics - Anfänger-Themen 3
S JTextfield Auswertung mit FocusListener Java Basics - Anfänger-Themen 7
L Problem mit Auswertung von String mit if Java Basics - Anfänger-Themen 10
T Log-Datei Auswertung Java Basics - Anfänger-Themen 7
B [Javadoc] Tutorial für die Auswertung des docs Java Basics - Anfänger-Themen 15
W Datentypen Auswertung von Ausdrücken (Teil 1) Java Basics - Anfänger-Themen 7
N auswertung von bildern Java Basics - Anfänger-Themen 14
C Denkanstoss für meine Auswertung Java Basics - Anfänger-Themen 5
C Auswertung Java Basics - Anfänger-Themen 5
B Auswertung eines Ausdrucks Java Basics - Anfänger-Themen 10
M seltsames Phänomen in der Auswertung boolscher Variablen Java Basics - Anfänger-Themen 7
V Grafische Auswertung (Ampel-System) Java Basics - Anfänger-Themen 12
M zahlenimport und auswertung Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben