Erste Schritte Arraywerte return aus UP

testbug

Mitglied
Sehr geehrtes Java-Forum,

da es sich unter anderem hier auch um eine Art der Hausaufgabe geht denke ich das diese hier richtig abgelegt ist.

Laut Aufgabe existiert in einem Unterprogramm ein Array mit 21 Zeilen. Welches jeweils 11 Inhaltsfelder besitzt. Die Informationen welche in besagtes Array gehören werden aus einer Datei Names "ARTIKEL.TXT" eingelesen. Über eine Schleife werden dem Array die Werte aus der txt zugeordnet.

Soweit so klar. Das einlesen und ausgeben der Dateien funktioniert und erschließt sich mir auch.
Mein Problem ist derzeit die Übergabe aus dem Array zurück zur weiteren Berechnung der Werte aus dem Array.

Derzeitiger Stand des Hauptprogrammes

Java:
package Artikelsortierung;

import java.io.*;

public class Artikelverwaltung {
    // 1 Schritt Einlesen aller Zeilen der Textdatei in Stingfeld, Ausgabe zum Test
    // 2 Schritt Erzeugen eines Arrays von Artikeln
  
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        einlesen(null);
        }
  
  
    public static void einlesen(double[] feld){
        System.out.print("Artikelverwaltung");
        // Deklaration
      
        String[] zeilen = new String[21]; //wie Anzahl ermitteln?
      
        String line;
        int n=1;        // Zähler für Zeilenzahl
        String dateiname= "ARTIKEL.TXT";
        Artikel[] Artikel = new Artikel [21];
      
        //Datei Öffnen
      
        BufferedReader input = null;
        try {
            input = new BufferedReader(new FileReader(dateiname));
            System.out.println("Datei wird geöffnet...");          
        } catch (FileNotFoundException e) {
            System.out.println("Datei nicht gefunden.");
        }      
            try {
                while((line = input.readLine())!=null){
                zeilen[n] = line;
                System.out.println(line);
                Artikel[n] = new Artikel ();
                Artikel[n].artnr = line.substring(0,8); // ersten 8 Zeichen der Artikelnummer
            //    System.out.println(Artikel[n].artnr);  // Ausgabe der Artikelnummer
              
              
                Artikel[n] = new Artikel ();
                Artikel[n].artbz = line.substring(9,39);
                //System.out.println(Artikel[n].artbz);
              
                Artikel[n].menge = line.substring(40,42);
                //System.out.println(Artikel[n].menge);
                      
                Artikel[n].bestand = Integer.parseInt(line.substring(43,47));          
                //System.out.println(Artikel[n].bestand);
              
                Artikel[n].maxe = Integer.parseInt(line.substring(48,52));
                //System.out.println(Artikel[n].maxe);
              
                Artikel[n].mine = Integer.parseInt(line.substring(53,56));
                //System.out.println(Artikel[n].mine);
              
                Artikel[n].herst = line.substring(57,98);      
                //System.out.println(Artikel[n].herst);
              
              
                Artikel[n].preis = Double.parseDouble(line.substring(99,106));
                //System.out.println(Artikel[n].preis);
                Artikel[n].maxp = Double.parseDouble(line.substring(107,114));
                //System.out.println(Artikel[n].maxp);
                Artikel[n].minp = Double.parseDouble(line.substring(115,121));
                //System.out.println(Artikel[n].minp);
                //Artikel[n].liefz = Integer.parseInt(line.substring(122,123));
                //System.out.println(Artikel[n].liefz);
                n = n+1;              
                }              
                input.close();
            } catch (IOException e) {
                System.out.println("Fehler beim Einlesen");
            }
        }
    }



Mit freundlichen Grüßen und vielen Dank
Testbug
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Deine Funktion bekommt einen Parameter, den Du aber nicht nutzt -> Also kannst Du den wohl streichen.
Und deine Funktion soll ja werte in ein Array laden und dann wohl auch zurück geben. Also musst Du den Rückgabetyp anpassen und dann das Array mit den Werten zurück geben.
 

DieKeksmaffia

Mitglied
Außerdem ist es nebenbei Standart Attribute einer Klasse als private zu deklarieren. Dies trifft auf deinen Artikel nicht zu und außerdem sind einige Attributnamen der Klasse Artikel nicht "sprechend" bzw. zu sehr gekürzt, so dass man einige nicht auf Anhieb versteht. (geht mir zumindest so)
Und du solltest, das machen, was bereits kneitzel geschrieben hat, denn ansonsten hat diese Methode keinen wirklichen Nutzen, da die Artikel zwar eingelesen werden und dann aber nicht weiter benutzt werden / "vergessen" werden.

Zusätzlich müsstes du dein Problem genauer definieren, da es nicht ganz ersichtlich ist wo es hakt.....
 

JStein52

Top Contributor
So:

Java:
package Artikelsortierung;

import java.io.*;

public class Artikelverwaltung {
    // 1 Schritt Einlesen aller Zeilen der Textdatei in Stingfeld, Ausgabe zum Test
    // 2 Schritt Erzeugen eines Arrays von Artikeln

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Artikel[] meineArtikel = einlesen("ARTIKEL.TXT");
        // und hier kannst du mit den Artikeln irgendwas machen.
        }

    public static Artikel[]  einlesen(String eingabeDatei){
        System.out.print("Artikelverwaltung");
        // Deklaration
    
        String[] zeilen = new String[21]; //wie Anzahl ermitteln?
    
        String line;
        int n=1;        // Zähler für Zeilenzahl
        Artikel[] Artikel = new Artikel [21];
    
        //Datei Öffnen    
        BufferedReader input = null;
        try {
            input = new BufferedReader(new FileReader(eingabeDatei));
            System.out.println("Datei wird geöffnet...");
        } catch (FileNotFoundException e) {
            System.out.println("Datei nicht gefunden.");
        }
            try {
                while((line = input.readLine())!=null){
                zeilen[n] = line;
                System.out.println(line);
                Artikel[n] = new Artikel ();
                Artikel[n].artnr = line.substring(0,8); // ersten 8 Zeichen der Artikelnummer
            //    System.out.println(Artikel[n].artnr);  // Ausgabe der Artikelnummer
            
            
                Artikel[n] = new Artikel ();
                Artikel[n].artbz = line.substring(9,39);
                //System.out.println(Artikel[n].artbz);
            
                Artikel[n].menge = line.substring(40,42);
                //System.out.println(Artikel[n].menge);
                    
                Artikel[n].bestand = Integer.parseInt(line.substring(43,47));       
                //System.out.println(Artikel[n].bestand);
            
                Artikel[n].maxe = Integer.parseInt(line.substring(48,52));
                //System.out.println(Artikel[n].maxe);
            
                Artikel[n].mine = Integer.parseInt(line.substring(53,56));
                //System.out.println(Artikel[n].mine);
            
                Artikel[n].herst = line.substring(57,98);   
                //System.out.println(Artikel[n].herst);
            
            
                Artikel[n].preis = Double.parseDouble(line.substring(99,106));
                //System.out.println(Artikel[n].preis);
                Artikel[n].maxp = Double.parseDouble(line.substring(107,114));
                //System.out.println(Artikel[n].maxp);
                Artikel[n].minp = Double.parseDouble(line.substring(115,121));
                //System.out.println(Artikel[n].minp);
                //Artikel[n].liefz = Integer.parseInt(line.substring(122,123));
                //System.out.println(Artikel[n].liefz);
                n = n+1;
                }            
                input.close();
            } catch (IOException e) {
                System.out.println("Fehler beim Einlesen");
            }
             return Artikel;
        }
    }
 
Zuletzt bearbeitet von einem Moderator:
K

kneitzel

Gast
Das Array zeilen wird aber auch nicht gebraucht. Du erstellst das Array zwar und füllst es, aber als lokale Variable ist es am Ende einfach nur ein Geschenk für den GC.
 
X

Xyz1

Gast
Ich hab das formatiert:
Java:
import java.io.*;

public class Artikelverwaltung {
    // 1 Schritt Einlesen aller Zeilen der Textdatei in Stingfeld, Ausgabe zum Test
    // 2 Schritt Erzeugen eines Arrays von Artikeln
    public static void main(String[] args) {
        // TODO Auto-generated method stub  

        einlesen(null);

    }

    public static void einlesen(double[] feld) {
        System.out.print("Artikelverwaltung");
        // Deklaration

        String[] zeilen = new String[21]; //wie Anzahl ermitteln?

        String line;
        int n = 1;        // Zähler für Zeilenzahl
        String dateiname = "ARTIKEL.TXT";
        Artikel[] Artikel = new Artikel[21];

        //Datei Öffnen
        BufferedReader input = null;
        try {
            input = new BufferedReader(new FileReader(dateiname));
            System.out.println("Datei wird geöffnet...");

        } catch (FileNotFoundException e) {
            System.out.println("Datei nicht gefunden.");

        }

        try {
            while ((line = input.readLine()) != null) {
                zeilen[n] = line;
                System.out.println(line);
                Artikel[n] = new Artikel();
                Artikel[n].artnr = line.substring(0, 8); // ersten 8 Zeichen der Artikelnummer
                //    System.out.println(Artikel[n].artnr);  // Ausgabe der Artikelnummer

                Artikel[n] = new Artikel();
                Artikel[n].artbz = line.substring(9, 39);
                //System.out.println(Artikel[n].artbz);

                Artikel[n].menge = line.substring(40, 42);
                //System.out.println(Artikel[n].menge);

                Artikel[n].bestand = Integer.parseInt(line.substring(43, 47));
                //System.out.println(Artikel[n].bestand);

                Artikel[n].maxe = Integer.parseInt(line.substring(48, 52));
                //System.out.println(Artikel[n].maxe);

                Artikel[n].mine = Integer.parseInt(line.substring(53, 56));
                //System.out.println(Artikel[n].mine);

                Artikel[n].herst = line.substring(57, 98);
                //System.out.println(Artikel[n].herst);

                Artikel[n].preis = Double.parseDouble(line.substring(99, 106));
                //System.out.println(Artikel[n].preis);
                Artikel[n].maxp = Double.parseDouble(line.substring(107, 114));
                //System.out.println(Artikel[n].maxp);
                Artikel[n].minp = Double.parseDouble(line.substring(115, 121));
                //System.out.println(Artikel[n].minp);
                //Artikel[n].liefz = Integer.parseInt(line.substring(122,123));
                //System.out.println(Artikel[n].liefz);
                n = n + 1;

            }
            input.close();
        } catch (IOException e) {
            System.out.println("Fehler beim Einlesen");

        }
    }
}

1. es compiliert, bis auf die Klasse Artikel kenne ich nicht,
2. du verwendest Substring, das ist eher suboptimal,
3. Index i (nicht n) fängt immer bei 0 an, außer in der Mathm.,
4. das Iterieren über Zeilen funktioniert ja schon mal,
5. input close muss bei so File sachen immer geschehen,
6. Kommentare sind ganz gut, aber verwirren auch manchmal.

Just my two cents
 
K

kneitzel

Gast
Falls in der Datei auch Leerzeichen vorkommen, wäre evtl. noch ein trim() Aufruf wichtig, da Integer.parse keine Leerzeichen mag. Das nur noch kurz am Rande als kleiner Hinweis zu möglichen Laufzeit-Problemen.
 

Bitfehler

Bekanntes Mitglied
Wäre das input.close() nicht sinnvoller in einem finally-Block aufgehoben, da im Falle einer Exception aktuell kein close stattfindet?
 

mrBrown

Super-Moderator
Mitarbeiter
Wäre das input.close() nicht sinnvoller in einem finally-Block aufgehoben, da im Falle einer Exception aktuell kein close stattfindet?
Ja, das close() kann aber wieder Exceptions werfen, oder einfach try-with-resources.

Aktuell gäb's auch 'ne NPE, wenn die Datei nicht geöffnet werden könnte, wenn ich's richtig sehe...
 

testbug

Mitglied
Ich danke euch vielmals.
Jstein hat den für mich erhellenden Moment angegeben.

Ein Verständnisproblem habe ich noch bei der Sache.

Java:
 double mdw =((meineArtikel[1].maxb-meineArtikel[1].minb)*meineArtikel[1].preis);
        System.out.println (mdw);

Über diesen Formel erzeuge ich eine Variable welche mir ausgegeben wird. Es benutzt jeweils den Inhalt des Feldes der ersten Stelle. Um mir den Inhalt des Arrays aller Felder der neuen Variable ausgeben zu lassen müsste ich wiederrum eine Schleife erzeugen welche den n bzw i hoch zählt.
Java:
int n=1;
     for (int i=0; i<n;i++) {   
        double mdw = ((meineArtikel[n].maxb-meineArtikel[n].minb)*meineArtikel[n].preis);
        System.out.println (mdw);

Dies gibt mir den neu berechneten Wert des ersten Feldes an.
Ich sehe gerade meinen Fehler nicht.
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
int n=1;
     for (int i=0; i<n;i++) {  
        double mdw = ((meineArtikel[n].maxb-meineArtikel[n].minb)*meineArtikel[n].preis);
        System.out.println (mdw);

Du zählst zwar i hoch (bzw nicht, da nur solange i<n(=1)), benutzt es aber nicht, sondern nutzt immer nur n als Index, n ist aber immer gleich 1.

Du solltest außerdem drauf achten, das der Index des ersten Elements 0 ist.
 
X

Xyz1

Gast
Ich bin ja etwas faul, deswegen hätte ich das so geschrieben:
Java:
import java.io.*;
import java.lang.reflect.*;
import java.util.*;

/**
 * @author DerWissende on 02/29/2016
 */
public class Artikelverwaltung {

    public static void main(String[] args) throws Exception {
        schreiben(new LinkedList<Artikel>(Arrays.asList(
                new Artikel("111", "112", "113", "114", "115", "116", "117", "118", "119", "120"),
                new Artikel("211", "212", "213", "214", "215", "216", "217", "218", "219", "220"),
                new Artikel("311", "312", "313", "314", "315", "316", "317", "318", "319", "320")
        )));
        einlesen();
    }

    public static LinkedList<Artikel> einlesen() throws Exception {
        System.out.print("Artikelverwaltung");
        LinkedList<Artikel> list = new LinkedList<Artikel>();
        BufferedReader reader = new BufferedReader(new FileReader("ARTIKEL.TXT"));
        String line;
        while ((line = reader.readLine()) != null) {
            String[] split = line.split(";;;");
            if (split.length == 10) {
                list.add((Artikel) Artikel.class.getConstructors()[0].newInstance((Object[]) split));
            }
        }
        reader.close();
        for (Artikel artikel : list) {
            System.out.println(artikel);
        }
        return list;
    }

    public static void schreiben(LinkedList<Artikel> list) throws Exception {
        BufferedWriter writer = new BufferedWriter(new FileWriter("ARTIKEL.TXT"));
        for (Artikel artikel : list) {
            for (Field field : Artikel.class.getFields()) {
                writer.write((String) field.get(artikel));
                writer.write(";;;");
            }
            writer.write("\n");
        }
        writer.close();
    }
}

class Artikel {

    public String nummer;
    public String bezeichnung;
    public String menge;
    public String bestand;
    public String maxEinkauf;
    public String minEinkauf;
    public String hersteller;
    public String preis;
    public String maxPreis;
    public String minPreis;

    public Artikel(String nummer, String bezeichnung, String menge, String bestand, String maxEinkauf, String minEinkauf, String hersteller, String preis, String maxPreis, String minPreis) {
        this.nummer = nummer;
        this.bezeichnung = bezeichnung;
        this.menge = menge;
        this.bestand = bestand;
        this.maxEinkauf = maxEinkauf;
        this.minEinkauf = minEinkauf;
        this.hersteller = hersteller;
        this.preis = preis;
        this.maxPreis = maxPreis;
        this.minPreis = minPreis;
    }

    public int getNummer() {
        return Integer.parseInt(nummer);
    }

    public String getBezeichnung() {
        return bezeichnung;
    }

    public int getMenge() {
        return Integer.parseInt(menge);
    }

    public int getBestand() {
        return Integer.parseInt(bestand);
    }

    public float getMaxEinkauf() {
        return Float.parseFloat(maxEinkauf);
    }

    public float getMinEinkauf() {
        return Float.parseFloat(minEinkauf);
    }

    public String getHersteller() {
        return hersteller;
    }

    public float getPreis() {
        return Float.parseFloat(preis);
    }

    public float getMaxPreis() {
        return Float.parseFloat(maxPreis);
    }

    public float getMinPreis() {
        return Float.parseFloat(minPreis);
    }

    @Override
    public String toString() {
        return "Artikel{" + "nummer=" + nummer + ", bezeichnung=" + bezeichnung + ", menge=" + menge + ", bestand=" + bestand + ", maxEinkauf=" + maxEinkauf + ", minEinkauf=" + minEinkauf + ", hersteller=" + hersteller + ", preis=" + preis + ", maxPreis=" + maxPreis + ", minPreis=" + minPreis + '}';
    }
}

gibt dann aus:
Code:
ArtikelverwaltungArtikel{nummer=111, bezeichnung=112, menge=113, bestand=114, maxEinkauf=115, minEinkauf=116, hersteller=117, preis=118, maxPreis=119, minPreis=120}
Artikel{nummer=211, bezeichnung=212, menge=213, bestand=214, maxEinkauf=215, minEinkauf=216, hersteller=217, preis=218, maxPreis=219, minPreis=220}
Artikel{nummer=311, bezeichnung=312, menge=313, bestand=314, maxEinkauf=315, minEinkauf=316, hersteller=317, preis=318, maxPreis=319, minPreis=320}

ich musste raten, was die Variablen bedeuten sollen.

Tatsächlich würde man das so nicht schreiben, viel zu Fehleranfällig,
aber ich habe damit ein anderes Thema aufgegriffen:
java - passing a String array as argument
Das bei StackOverflow leider nicht beantwortet wurde,
und wo ich auch nicht antworten möchte.

Wenn ich es richtig geschrieben hätte, wäre es eine Komplettlösung, du musst die Lösung also selber bearbeiten.

Schritt A: Weißt du, wie du neue Elemente in eine Liste legen und auch wieder lesen kannst?
 
X

Xyz1

Gast
Also noch-mal, ich wollte den Konstruktor nicht mit (split[0], split[1], usw. ) aufrufen, weil mir das zu umständlich war, sondern einfach mit split. Vielleicht bist du jetzt auch maximal verwirrt.

Welche Form hat denn die "ARTIKEL.TXT" ? Ein Beispiel ist manchmal alles klarer. ABER, wir (ich) schreiben dir keine komplette Artikelverwaltung. Das ist eine aufgabe, die ich später selber mal mache.
 

Neue Themen


Oben