gewichtung von noten und csv

coleman_

Mitglied
hallo leute
vorweg, ich hoffe ihr konntet euch gut in diesen feiertagen erholen und ihr habt kein beuchlein angesetzt :p
kommen wir zu meinem anliegen/problem.
ich bringe mir gerade java bei, klappt auch soweit hervorragend.
jetzt habe ich ein projekt am laufen, bei dem man seine noten eintragen kann, das muss man sich wie folgt vorstellen:
man hat eine anwendung, man wählt ein semester aus, man wählt ein modul aus, man gibt seinen namen ein und dann trage ich als schüler meine noten in die datenbank ein und wie diese gewichtet wird in prozent, soweit so gut, funktioniert alles.
ja, als anfänger sollte man sich nicht umbedingt mit jpa herumschlagen, aber mich reizte das.
kommen wir zu meiner ersten frage:
die module, die ich einlese, mach ich hardcoded von einem csv-file, dazu wird das plugin opencsv verwendet.
ich weiss, ich könnte sie direkt in die db speichern, allerdings wollte ich den umgang mit csv üben. die module werden nur einmal eingelesen, am anfang. und auch nur wirklich einmal, dann sind sie in der datenbank vorhanden.
meine frage ist, wie soll ich das csv file gestalten?
folgende ansätze hatte ich:
1;44,einführung in java;
1, bedeutet hier das semester 1, 44, ist die modul nummer und einführung in java die beschreibung.
mit opencsv trenne ich dann nach;
das heisst, ich habe dann die 1; alleine stehen und die nummer und die beschreibung zusammen.
um diese dann auch noch zu trennen benutze ich die split methode.
findet ihr diesen ansatz gut?
oder eine andere idee war:
1;44;einführung in java;
1;333;einführung in C;
bei diesem ansatz ist jeder eintrag auf einer neuen zeile, was haltet ihr von diesem ansatz?
mir scheint der zweite ansatz ist ein wenig für die katz.
kommen wir zum zweiten problem, und bei diesem problem schäme ich mich ein wenig sogar
:p
ich erwähnte vorher oben, der user gibt seine note an und muss seine gewichtung zu der note eingeben:
z.b 4 und diese zählt 30% und eine 5 diese zählt 40%.
heisst das für mich persönlich, ich muss:
4 * 0.3 + 5 * 0.4 =3.2
3.2 : 2 =1.6 (wäre dann der durchschnitt, rechne ich das richtig aus?)
ich muss eigentlich auch wärend dem programmieren überprüfen, dass wenn die gewichtung 100% erreicht, dass der user das modul nicht mehr bearbeiten kann, sehe ich das richtig?
sorry, für die blöde frage.
danke für eure antwort, auch wenns wirklich viel geworden ist.
 

JStein52

Top Contributor
1;44,einführung in java;
Warum denn so und dann mit split anfangen ? Wenn diese drei spalten doch unterschiedliche Attribute sind würde ich sie in der csv-Datei auch mit ";" getrennt angeben !!
Und deine Rechnung scheint mir richtig. Aber zur Gewichtung würde ich sagen eine einzelne Note kann max. die Gewichtung 100% haben. Aber warum soll er dann das Modul nicht weiter bearbeiten dürfen ? Ist es nicht möglich zu einem Modul mehrere Noten zu erhalten die evtl. alle mit 100% gewichtet werden ? Das hängt jetzt von der Studienordnung ab. Die musst du dazu mal lesen !!
 

coleman_

Mitglied
Warum denn so und dann mit split anfangen ? Wenn diese drei spalten doch unterschiedliche Attribute sind würde ich sie in der csv-Datei auch mit ";" getrennt angeben!
!
hallo
hmm, wenn ich alle mit ; angebe, scheint mir das doch ein wenig komisch zu sein, wir haben dann ganz viele module, und ich weiss nicht so recht beim einlesen, wo ich aufhören soll oder nicht.
ich drücke mich unglücklich aus, merke es gerade auch, aber ich probiers mal an einem Beispiel:
1(Semestertyp);44(modul nummer);einführugn in Java(modulbeschreibung);

wenn ich jetzt andere module im Semester habe, dann weiss ich nicht so recht wo ein modul endet, modul nr und Beschreibung ist ja zusammen, verstehst was ich mein?
wäre es dann nicht korrekter, wenn ich modul nr und Beschreibung mit commata trenne, dann wenn ich über das Array laufe, das mit der splitmethode mit ; trenne?
ist ein wenig schwierig zu erklären ^^, hoffentlich konntest dumich trotzdem verstehen.
wegen den noten, danke, so weit habe ich nicht überlegt, klar ist es möglich das du mehrere noten mit 100% hast.
 

JStein52

Top Contributor
Wie sehen denn deine Tabellen in der Datenbank aus in denen du die Module speicherst ? Wenn du da auch nur die Nummer und die Beschreibung zusammenspeicherst würde ich es auch in der cvs-Datei so machen. Nur warum du mehr Module kriegst wenn du die Nummer und die Beschreibung getrennt speicherst habe ich nicht verstanden. Aber ich kenn ja auch deine Datenstrukturen nicht in denen du das speicherst. Schau einfach mal an wieviel Stellen du einfach nur die Nummer zur Identifikation des Moduls benutzt. Wenn du das überall machst würde ich die Nummer eigens führen, ansonsten so wie du es meintest.
 

Dukel

Top Contributor
Sowohl in einer DB als auch in einer CSV Datei sind die Datensätze idR durch mehrere Zeilen getrennt.
Du liest jede Zeile ein (oder das csv Plugin) und trennst mit einem (z.B. Semikolon) Zeichen. Dann hast du alle Datensätze mit drei Werten (Semstertyp, Modul Nummer, Beschreibung).
 

coleman_

Mitglied
also leute, ich habe mal eifrig weiter gearbeitet, gerne will ich euch meine lösung zeigen, bitte sagt mir dann, ob man das auch im echten programmiererleben machen würde:
zuerst will ich euch meine zwei entities für die datenbankklasse zeigen, das ist insofern wichtig, damit ihr den aufbau später für das csv versteht.
folgend die klasse term, welches ein Semester darstellt:
Java:
@Entity
public class Term {
   @Id
   private Integer termId;
   @OneToMany(mappedBy ="owner")
   private List<Modul> moduls;

   public Term() {
   }

   public Term(Integer termId) {
     this.termId = termId;
     moduls = new ArrayList<Modul>();
   }

   public void setModul(Modul modul) {
     moduls.add(modul);
   }
}
folgend die modulklasse:
Java:
@Entity
public class Modul {
   @Id
   private Integer modulNr;
   private String modulDescription;
   // @ManyToOne(fetch =FetchType.LAZY)
   @JoinColumn(name = "TERM_ID")
   private Term term;

   public Modul() {
   }

   public Modul(Integer modulNr, String modulDescription) {
     this.modulNr = modulNr;
     this.modulDescription = modulDescription;
   }

   public Integer getModulNr() {
     returnmodulNr;
   }
   
   public String getModulDescription() {
     returnmodulDescription;
   }

   public void setModulDescription(String modulDescription) {
     this.modulDescription =modulDescription;
   }
   
   public Term getTerm() {
     return term;
   }

   public void setTerm(Term term) {
     this.term = term;
   }
}
ich habe jetzt natürlich einige Sachen weggelassen, die nicht wichtig sind, für unser vorhaben.
jetz tfolgt der aufbau des csv-files:
1;100;einfuehrung in PHP;101;einFuehrung in html;
dabei ist 1, das Semester, dieses steht immer amanfang der zeile, das andere ist denke ich selbsterklärend.
jetzt kommt meine Methode, die das lesen durchführt:
Java:
try (CSVReader reader = new CSVReader(new FileReader("module.csv"), ';')) {
   String[] line;
   while ((line = reader.readNext()) != null) {
     intpos = 0;
     Term term = new Term(Integer.[I]valueOf[/I](line[pos]));
     Integer modulNr = null;
     String modulDescription = null;

     for (pos = 1; pos < line.length; pos++) {
       if (pos % 2 == 0) {
         modulNr = Integer.[I]valueOf[/I](line[pos]);
       }
       if (pos % 2 != 0) {
         modulDescription = line[pos];
       }
     }
     Modul modul = new Modul(modulNr, modulDescription);
     modul.setTerm(term);
     term.setModul(modul);
   }
} catch (IOException e) {
}
für mich ist vor allem das lesen wichtig, würdet ihr etwas anders machen? habt ihr noch Inputs wegem aufbau des csv files?
danke.
 
Zuletzt bearbeitet von einem Moderator:

Dukel

Top Contributor
Mach es doch wie jedes klassische CSV File und nicht anderst:
Code:
1;100;einfuehrung in PHP
1;101;einFuehrung in html
2;200;foo
2;201;bar

Alles andere macht es viel zu komplex.
 

coleman_

Mitglied
das war in meiner ersten Version auch so, das ich jedes Semester wider in einer zeile schreibe... ist die Version besser? als meine jetzige lösung?
 

Ähnliche Java Themen

Neue Themen


Oben