Collections

RaptoXX

Grünschnabel
Hallo!

Ich habe ein Problem bei einer Aufgabe, die ich nicht richtig verstanden habe, deswegen wollt ich hier mal fragen, ob mir jemand den passenden Schubs geben kann.
Es soll in einer weiteren Klasse "Studentenverwaltung" eine Liste von Datensätzen aufgenommen werden. Dafür habe ich bis jetzt die Klasse Mensch und die Klasse Student, die wie folgt aussehen:
Code:
package vererbung;

public class mensch {

	private int alter;
	private char geschlecht;
	private String name;

	public mensch(int alter, char geschlecht, String name) {
	setAlter(alter);
	setGeschlecht(geschlecht);
	setName(name);
	}
	public int getAlter() {
	return alter;
	}
	void setAlter(int alter) {
	this.alter = alter;
	}
	public char getGeschlecht() {
	return geschlecht;
	}
	void setGeschlecht(char geschlecht) {
	this.geschlecht = geschlecht;
	}
	public String getName() {
	return name;
	}
	void setName(String name) {
	this.name = name;
	}
	public String getTyp() {
	String typ = "Mensch";
	return typ;
	}
	}
und
Code:
package vererbung;

public class Student extends mensch {
	private int matrikelnummer;
	public Student(int matrikelnummer, int alter, char geschlecht, String name) {
	super(alter, geschlecht, name);
	this.matrikelnummer = matrikelnummer;
	}
	void setMatrikelnummer(int matrikelnummer) {
	this.matrikelnummer = matrikelnummer;
	}
	int getMatrikelnummer() {
	return matrikelnummer;
	}
	String getTyp(String Student) {
	return Student;
	
}
}

Ich weiß, dass ich in der Klasse "Studentenverwaltung" mit einer ArrayList arbeite, die ich dann mit Daten befüllen soll. Das Problem besteht darin, die Datensätze einzugeben.
Ich habe sie, in der Reihenfolge, wie sie in der Klasse Student stehen, eingegeben mit:
Code:
        ArrayList<Student> liste = new ArrayList<Student>();
        liste.add(new Student(0124, 19, w, Luise));
        liste.add(new Student(0125, 17, m, Hans));

Das Geschlecht und der Name werden dabei aber als falsch markiert, weil er diese nicht als Eigenschaft ansieht, sondern als Variable. Wie kann ich das realisieren?

mfG T.G.
 
Moin und willkommen im Forum ^^

Klassen beginnen in Java mit einem Großbuchstaben ^^

Dein Problem besteht darin, dass du so wirklich Variablen übergibst (die aber vermutlich nicht existieren). Du willst aber Werte übergeben.

char-Werte sehen so aus:
Java:
char c = 'a';
String-Werte sehen so aus:
Java:
String str = "mein string";

Dein Code müsste also so aussehen:
Java:
List<Student> liste = new ArrayList<Student>();

liste.add(new Student(0124, 19, w, Luise));
liste.add(new Student(0125, 17, m, Hans));
Ich habe den Typ von liste mal eine Stufe abstrakter gemacht und ihn zu java.util.List geändert. Dein Code ist nicht falsch, keine Angst. Es geht nur um die Austauschbarkeit, daher ist es besser mit einem möglichst abstrakten Typen zu arbeiten (quasi mit dem kleinsten gemeinsamen Nenner).
 
Danke. Jetzt sind die Fehler verschwunden. :)

Jetzt muss ich noch realisieren, dass ich diese Datensätze als Tabelle ausgeben kann und auch nach Vor- und Nachnamen sortieren kann. (Grad erst gesehen, dass die auch nen Nachnamen brauchen :D)

Zur Tabelle dachte ich mir, dass ich diese mit dem normalen
Code:
System.out.println(...)
mache und diesen dann mit den Formatierungsmöglichkeiten erweitere. Gibt es dort bestimmte Arten von Modifikationen, die sich dafür eignen würden?

Das Sortieren wollte ich durch
Code:
Collections.sort(liste)
gestalten, wobei ich das Kriterium, nach dem sortiert werden soll, realisiere durch:
Code:
switch
case 1 (Vname)
...break;
case 2 (Nname)
...break;
Dabei müsste ich dann noch in die Klasse "Student" noch 2 Dinge einfügen:
Code:
public int compareTo(Student other)
und
Code:
Comparable<Student>
Wie komme ich da von Syntax her, am besten weg?

EDIT: Gibt noch etwas Anderes, was ein Problem hat. Und zwar ist bei mir das "package" bei der Klasse Studentenverwaltung rot unterstrichen. Als Fehlermeldung wird das angegeben:
"Syntax error on token "package", import expected."

Was hat das mit dem Package zu tun?
Hier mal meine bis jetzt erweiterte Klasse Studentenverwaltung:
Code:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

package vererbung;

public class Studentenverwaltung{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
        List<Student> liste = new ArrayList<Student>();
        
        liste.add(new Student(0124, 19, 'w', "Luise", "Wagner", "12-INB-1"));
        liste.add(new Student(0125, 17, 'm', "Hans", "Wurst", "12-INB-2"));
        liste.add(new Student(0127, 21, 'm', "Tom", "Bock", "12-INB-1"));
        liste.add(new Student(0126, 18, 'm', "Mario", "Haus", "12-INB-3"));
        liste.add(new Student(0133, 22, 'w', "Saskia", "Brauer", "12-INB-2"));
        liste.add(new Student(0142, 19, 'w', "Julia", "Hess", "12-INB-1"));
        liste.add(new Student(0141, 20, 'w', "Christin", "Berger", "12-INB-3"));
        liste.add(new Student(0132, 20, 'm', "Andreas", "Naumann", "12-INB-1"));
        liste.add(new Student(0135, 18, 'w', "Caroline", "Großmann", "12-INB-2"));
        liste.add(new Student(0155, 20, 'm', "Peter", "Naumann", "12-INB-3"));
        
        Collections.sort(liste);
        System.out.println("%6d" + liste);
}
}

mfG T.G.
 
Zuletzt bearbeitet:
Gibt noch etwas Anderes, was ein Problem hat. Und zwar ist bei mir das "package" bei der Klasse Studentenverwaltung rot unterstrichen. Als Fehlermeldung wird das angegeben:
"Syntax error on token "package", import expected."

Package steht üblicher Weise am Anfang.
 
Die Sortierung muss ja innerhalb der Klasse Student gemacht werden, also ändere die Klasse Student in

public class Student extends Mensch implements Comparable<Student>

Zum Problem mit der Sortierung nach Name und Vorname. Die Klasse Mensch hat nur ein Attribut Name. Angenommen dieses Attribut enthält jeweils Name + Vorname dann kannst Du nach Name sortieren und so wird automatisch auch nach Vorname sortiert. Das setzt allerdingst voraus, dass das Attribut Name immer die Literale Name + nichts oder Name + Vorname enthält. Wenn das nicht der Fall ist, dann musst innerhalb von compareTo zusätzlich nach Vorname vergleichen.

BTW: Der Klassenname Person finde ich besser als den Bezeichner Mensch.
 
Zuletzt bearbeitet:
Hallo! Ich habe das ganze Projekt erstmal in ein anderes Java Projekt verschoben, damit ich erstmal die Fehler eliminieren kann. Das bisherige Projekt sieht so aus:
(Schönheitsveränderungen bzgl. der Ausrichtung des Textes, sowie Beseitigung der Schreibfehler bzgl. Groß-/Kleinschreibung erfolgen noch!)
Code:
package vererbung1;

public class mensch {

	private int alter;
	private char geschlecht;
	private String vname;
	private String nname;

	public mensch(int alter, char geschlecht, String vname, String nname) {
	setAlter(alter);
	setGeschlecht(geschlecht);
	setVName(vname);
	setNName(nname);
	}
	public int getAlter() {
	return alter;
	}
	void setAlter(int alter) {
	this.alter = alter;
	}
	public char getGeschlecht() {
	return geschlecht;
	}
	void setGeschlecht(char geschlecht) {
	this.geschlecht = geschlecht;
	}
	public String getVName() {
	return vname;
	}
	void setVName(String vname) {
	this.vname = vname;
	}
	public String getNName() {
	return nname;
	}
	void setNName(String nname) {
	this.nname = nname;
	}
	public String getTyp() {
	String typ = "Mensch";
	return typ;
	}
	}
Code:
package vererbung1;

public class Student extends mensch implements Comparable<Student>{
	private int matrikelnummer;
	private String studiengang;
	public Student(int matrikelnummer, int alter, char geschlecht, String vname, String nname, String Studiengang) {
		super (alter,geschlecht,vname,nname);
		this.matrikelnummer = matrikelnummer;
		this.studiengang = studiengang;
	}
	void setMatrikelnummer(int matrikelnummer) {
	this.matrikelnummer = matrikelnummer;
	}
	int getMatrikelnummer() {
	return matrikelnummer;
	}
	void setStudiengang(String studiengang) {
	this.studiengang = studiengang;
	}
	String getStudiengang() {
	return studiengang;
	}
	String getTyp(String Student) {
	return Student;
	}
	public int compareTo(Student other){
		if (this.getNName().compareTo(other.getNName())==-1)return -1;
		else if (this.getNName().compareTo(other.getNName())==1)return 1;
		else if (this.getNName().equals(other.getNName())&&(this.getVName().compareTo(other.getVName())==-1))return -1;
		else if (this.getNName().equals(other.getNName())&&(this.getVName().compareTo(other.getVName())==1))return 1;
		else return 0;
	} 

}
Code:
package vererbung1;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Studentenverwaltung{

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner s = new Scanner(System.in);
        ArrayList<Student> liste = new ArrayList<Student>();
        
        liste.add(new Student(350124, 19, 'w', "Luise", "Auermann", "12-INB-1"));
        liste.add(new Student(250125, 17, 'm', "Hans", "Zaun", "12-INB-2"));
        liste.add(new Student(440127, 21, 'm', "Tom", "Bock", "12-INB-1"));
        liste.add(new Student(760126, 18, 'm', "Mario", "Haus", "12-INB-3"));
        liste.add(new Student(140133, 22, 'w', "Saskia", "Brauer", "12-INB-2"));
        liste.add(new Student(560142, 19, 'w', "Julia", "Hess", "12-INB-1"));
        liste.add(new Student(930141, 20, 'w', "Christin", "Berger", "12-INB-3"));
        liste.add(new Student(270132, 20, 'm', "Andreas", "Wagner", "12-INB-1"));
        liste.add(new Student(180135, 18, 'w', "Caroline", "Großmann", "12-INB-2"));
        liste.add(new Student(810155, 20, 'm', "Peter", "Auermann", "12-INB-3"));
         
        System.out.println("(1) Tabelle ausgeben");
        System.out.println("(2) Tabelle sortieren");
        System.out.println("(3) Datensätze editieren");
        System.out.println("(4) Datensätze löschen");
        System.out.println("(5) Programm beenden");
        
        System.out.println("Auswahl: ");
        int zahl = s.nextInt();
        while (zahl !=5){      
        	switch(zahl){
        	case 1:
        		System.out.printf("%10s%10s%10s&%10s%10s%10s","Matrikelnr.","Alter","Geschlecht","Vorname","Nachname","Studiengang");
        		System.out.println(" ");
        		for (Student p : liste)
            	System.out.printf("%10d%10d%10s&%10s%10s%10s\t\n",p.getMatrikelnummer(),p.getAlter(),p.getGeschlecht(),p.getVName(),p.getNName(),p.getStudiengang());
        		break;
        	case 2:
        		Collections.sort(liste);
        		System.out.printf("%10s%10s%10s%10s%10s%10s","Matrikelnummer Alter Geschlecht Vorname Nachname Studiengang");
            	for (Student p : liste)
            	System.out.printf("%10d%10d%10s&%10s%10s%10s\t\n",p.getMatrikelnummer(),p.getAlter(),p.getGeschlecht(),p.getVName(),p.getNName(),p.getStudiengang());
            	break;
        	case 3:
        		break;
        	case 4:
        		break;
        	}
			System.out.println("Auswahl: ");
			zahl = s.nextInt();
        }
}
}
Das Editieren und Löschen von Datensätzen mache ich noch. Dabei dachte ich daran, den jeweiligen Datensatz anhand der Matrikelnummer, per Eingabeaufforderung, zu suchen, da diese einmalig ist. Mit den "Settern" sollte der Rest dann kein Problem sein.

mfG T.G.
 
Die Methode compareTo mit zwei Feldern funktioniert vereinfacht auch so

Code:
	@Override
	public int compareTo(Student s {
		int nameCompare = this.getName().compareTo(s.getName());
		// Namen sind nicht gleich
		if (nameCompare != 0) {
			return nameCompare;
               // Die Namen sind gleich, vergleiche zusätzlich nach Vorname
		} else {
			return this.getVorname().compareTo(s.getVorname());
		}
	}
 
Hallo! Wünsch noch ein frohes neues Jahr!

Ich hab jetzt die Ausgabe der Liste fertig. Beim Editieren und Löschen gibts jetzt noch ein Problem.

Ich wollt den jeweiligen Datensatz per Eingabe der Matr.-Nr. finden. Das Problem ist, dass ich diese Suche nicht wirklich mit in die CompareTo-Methode reinsetzen kann.

Vielleicht lässt sich das auch als Schleife machen, aber leider weiß ich da nicht wirklich, wie ich das realisiere, da ich dort ja eig. auch nen Vergleich mache, zwischen den Matr.-Nr. der Studenten und der eingegebenen Nummer.

Wäre dann eigentlich alles. Der Rest sind dann nur noch Schönheitsveränderungen.

mfG RaptoXX
 

Neue Beiträge

Zurück