Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Irgendwie ist die Klasse Person totaler Käse. Was soll T überhaupt darstellen? Warum sind Name und Alter vom Typ T? Ist Name nicht eher String und Alter int? Wofür dient der generische Typ T überhaupt? So kann das alles nicht funktionieren.
Da ist einiges schief gegangen... Der Name und das Alter werden immer Zeichenketten und Zahlen sein:
Java:
class Person implements Older<Person> {
private String name;
private int alter;
public Person(String name, int alter) {
this.name = name;
this.alter = alter;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAlter() {
return alter;
}
public void setAlter(int alter) {
this.alter = alter;
}
@Override
public boolean isOlder(Person other) {
return this.alter > other.alter;
}
}
Bei dem interface ist die public Deklaration überflüssig. Alle Methoden - die nicht private sind - sind implizit public.
Java:
interface Older<T> {
boolean isOlder(T other);
}
Der Trick ist jetzt die erste Peron zu wählen und Schritt für Schritt durchgehen und die älteste Person auswählen:
Java:
class Group<T extends Person> {
private List<T> list = new ArrayList<>();
public void add(T member) {
list.add(member);
}
public Person getOldestPerson() {
// Wenn Liste leer ist, dann 'null' zurückgeben oder Exception werfen
Person oldest = ...; // Erste Person auswählen
for (...) { // Ab dem 2ten Element starten und bis zur exklusive Listenlänge iterieren.
if (...) { // Überprüfung ob oldest noch immer die älteste Person ist
oldest = ...; // Zuweisung der älteren Person
}
}
return ...; // Rückgabe der ältesten Person
}
}
Da ist einiges schief gegangen... Der Name und das Alter werden immer Zeichenketten und Zahlen sein:
Java:
class Person implements Older<Person> {
private String name;
private int alter;
public Person(String name, int alter) {
this.name = name;
this.alter = alter;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAlter() {
return alter;
}
public void setAlter(int alter) {
this.alter = alter;
}
@Override
public boolean isOlder(Person other) {
return this.alter > other.alter;
}
}
Bei dem interface ist die public Deklaration überflüssig. Alle Methoden - die nicht private sind - sind implizit public.
Java:
interface Older<T> {
boolean isOlder(T other);
}
Der Trick ist jetzt die erste Peron zu wählen und Schritt für Schritt durchgehen und die älteste Person auswählen:
Java:
class Group<T extends Person> {
private List<T> list = new ArrayList<>();
public void add(T member) {
list.add(member);
}
public Person getOldestPerson() {
// Wenn Liste leer ist, dann 'null' zurückgeben oder Exception werfen
Person oldest = ...; // Erste Person auswählen
for (...) { // Ab dem 2ten Element starten und bis zur exklusive Listenlänge iterieren.
if (...) { // Überprüfung ob oldest noch immer die älteste Person ist
oldest = ...; // Zuweisung der älteren Person
}
}
return ...; // Rückgabe der ältesten Person
}
}
Muss du das Older interface implementieren? Meiner Meinung nach ist es überflüssig. Ich habe dass so gemacht das Person, das Comparable interface implementiert um den Vergleich der compareTo method zu überlassen. Die Group Klasse brauchst du auch nicht. Meine Test Klasse sieht so aus:
Java:
package de.test;
import de.test.Person;
import java.util.List;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Beka", 26));
people.add(new Person("Gela", 28));
people.add(new Person("Carl", 24));
people.sort((lhs, rhs) -> lhs.compareTo(rhs));
people.forEach(System.out::println);
}
}
Die Ausgabe ist
Code:
[Name: Gela Alter: 28]
[Name: Beka Alter: 26]
[Name: Carl Alter: 24]
Im obigen code fehlt die Person Klasse. Wie gesagt, habe ich das Comparable interface benutzt, die Methoden compareTo und toString implementiert. Wenn dir allerdings lambda expression und streams nichts sagt dann ist der code allerdings schwer zu verstehen.
Da ist einiges schief gegangen... Der Name und das Alter werden immer Zeichenketten und Zahlen sein:
Java:
class Person implements Older<Person> {
private String name;
private int alter;
public Person(String name, int alter) {
this.name = name;
this.alter = alter;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAlter() {
return alter;
}
public void setAlter(int alter) {
this.alter = alter;
}
@Override
public boolean isOlder(Person other) {
return this.alter > other.alter;
}
}
Bei dem interface ist die public Deklaration überflüssig. Alle Methoden - die nicht private sind - sind implizit public.
Java:
interface Older<T> {
boolean isOlder(T other);
}
Der Trick ist jetzt die erste Peron zu wählen und Schritt für Schritt durchgehen und die älteste Person auswählen:
Java:
class Group<T extends Person> {
private List<T> list = new ArrayList<>();
public void add(T member) {
list.add(member);
}
public Person getOldestPerson() {
// Wenn Liste leer ist, dann 'null' zurückgeben oder Exception werfen
Person oldest = ...; // Erste Person auswählen
for (...) { // Ab dem 2ten Element starten und bis zur exklusive Listenlänge iterieren.
if (...) { // Überprüfung ob oldest noch immer die älteste Person ist
oldest = ...; // Zuweisung der älteren Person
}
}
return ...; // Rückgabe der ältesten Person
}
}