bvdcomp
Goto Top

JAVA Comparator in FOR-Schleife

Ich soll ein Programm erstellen welches nach Noten, Alter, Name und Nr sortiert.
Ich habe folgenden Code der einen Fehler ausgibt:

public static void main(String args) {
List<Comparator> comp = new ArrayList<Comparator>();

comp.add(new NummerSortieren());
comp.add(new NameSortieren());
comp.add(new AlterSortieren());
comp.add(new NoteSortieren());

Student studis = {
new Student(4, "Archimedes Syrakus", 2296, 6.0),
new Student(3, "Fritzli Schneider", 9, 5.9),
new Student(1, "Walterli Tell junjun.", 12, 4.3),
new Student(6, "Greengrey vonRotz", 20, 3.7),
new Student(5, "Maria Stuart", 467, 2.9)
};

for (Comparator curComp: comp) {
System.out.println("nach Notendurchschnitt sortiert:");
System.out.println("-----------");
for (Student alle : studis) {
System.out.println(alle);
}
Arrays.sort(studis, comp);
System.out.println("Sortiert:");
System.out.println("-----------");
for (Student alle : studis) {
System.out.println(alle);
}
System.out.println("-----------");
System.out.println("Process completed.");
}
}

Fehler:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The method sort(T, Comparator<? super T>) in the type Arrays is not applicable for the arguments (Student, List<Comparator>)

at Student.main(Student.java:40)


Kann mir jemand da weiter helfen?

Content-Key: 155204

Url: https://administrator.de/contentid/155204

Printed on: April 20, 2024 at 11:04 o'clock

Member: bankaifan
bankaifan Nov 25, 2010 at 12:17:22 (UTC)
Goto Top
Hey,

schau doch mal was der Compiler in deiner Studentklasse sagt. oder poste sie hier.
Member: suchong
suchong Nov 22, 2011 at 12:02:43 (UTC)
Goto Top
Hallo
In dieser Implementierung ist ziemlich vieles falsch! Zuerst einmal sollte die Liste den Typ Student beinhalten, also List<Stundent> students = new ArrayList<Student>(). Dann, weil Du nach verschiedenen Feldern sortieren willst, musst Du für diese je eine eigene Klasse implementieren, z.B.

public class SortName implements Comparator<Student> {

und dann die Methode compare(Student s1, Student s2) und den Vergleich für den Namen. Analoges für Nr, Alter und Noten. Um die ArrayList nach Studenthamen zu sortieren, rufe ein Collections.sort(students, new SortName()) auf. Dann werden die in einer for-Schleife auch nach Namen ausgegeben.

Ich habe hierzu ein Tutorial veröffentlicht: Sortierung eigener Objekte in einer ArrayList mit Comparable und Comparator

Hier ein Versuch zur Korrektur. Die Klasse Student könnte wie folgt aussehen:

public class Student {

	private int nr;
	private String name;
	private int alter;
	private double note;
	
	public Student(int nr, String name, int alter, double note) {
		this.name = name;
		this.alter = alter;
		this.nr = nr;
		this.note = note;
	}

	public double getNote() {
		return note;
	}

	public void setNote(double note) {
		this.note = note;
	}

	public int getNr() {
		return nr;
	}

	public String getName() {
		return name;
	}

	public int getAlter() {
		return alter;
	}
}

Bevor sortiert werden kann, müssen noch die Klassen erstellt werden, welche das Interface Comparator implementieren. Musterhaft sei das für die Noten und für das Alter:

import java.util.Comparator;

/**
 * Sortierung nach Noten
 */
public class SortNoten implements Comparator<Student>{

	@Override
	public int compare(Student s1, Student s2) {
		// Die Notenwerte werden zu Double gewandelt, 
		// damit die Methode compareTo genutzt werden kann
		Double d1 = s1.getNote();
		Double d2 = s2.getNote();
		return d1.compareTo(d2);
	}
}

import java.util.Comparator;

/**
 * Sortierung nach Alter
 */
public class SortAlter implements Comparator<Student>{

	@Override
	public int compare(Student s1, Student s2) {
		Integer a1 = s1.getAlter();
		Integer a2 = s2.getAlter();
		return a1.compareTo(a2);
	}
}

Zum Schluss wird eine Klasse erstellt, welche die Methode main() enthält, welche die Studenten erzeugt, diese einer ArrayList hinzufügt, dann die Liste nach Noten aufsteigend sortiert und ausgibt und dann die Liste nach Alter aufsteigend sortiert und ebenfalls auf der Konsole ausgibt.

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;

public class StudentExample {
	private static List<Student> students = new ArrayList<Student>();
	
	public static void main(String args) {
		students.add(new Student(4, "Archimedes Syrakus", 2296, 6.0));  
		students.add(new Student(3, "Fritzli Schneider", 9, 5.9));  
		students.add(new Student(1, "Walterli Tell junjun.", 12, 4.3));  
		students.add(new Student(6, "Greengrey vonRotz", 20, 3.7));  
		students.add(new Student(5, "Maria Stuart", 467, 2.9));  
		
		System.out.printf("Nach Noten sortiert:%n");  
		Collections.sort(students, new SortNoten());
		Iterator<Student> itr = students.iterator();
		Student s;
		while (itr.hasNext()) {
			s = itr.next();
			System.out.printf("Student %s, Note %.2f%n", s.getName(), s.getNote());  
		}
		
		System.out.print("%n");  
		System.out.printf("Nach Alter sortiert:%n");  
		Collections.sort(students, new SortAlter());
		itr = students.iterator();
		while (itr.hasNext()) {
			s = itr.next();
			System.out.printf("Student %s, Alter %d%n", s.getName(), s.getAlter());  
		}
	}
}

Der Output entspricht nicht einer Musterformatierung, hauptsache die Sortierungen stimmen:

Nach Noten sortiert:
Student Maria Stuart, Note 2.90
Student Greengrey vonRotz, Note 3.70
Student Walterli Tell junjun., Note 4.30
Student Fritzli Schneider, Note 5.90
Student Archimedes Syrakus, Note 6.00
%nNach Alter sortiert:
Student Fritzli Schneider, Alter 9
Student Walterli Tell junjun., Alter 12
Student Greengrey vonRotz, Alter 20
Student Maria Stuart, Alter 467
Student Archimedes Syrakus, Alter 2296

Eine Sortierung nach Nummer und Namen funktioniert analog. Bei Fragen stehe ich gerne zur Verfügung.