Personen sortieren mit Comparator

Diskutiere Personen sortieren mit Comparator im Java Basics - Anfänger-Themen Bereich.
W

Wayne139

Hallo, ich möchte Personen alphabetisch nach ihrem Nachnamen sortieren.
Ich soll eine Klasse PersonComparator erstellen, die eine Schnittstelle Comparator implementiert und mit der compare-Methode
die Sortierung macht. Wie muss ich das machen mit PersonComparator und Comparator?

Mein Interface Comparator
Java:
public interface Comparator<Person> {
    String compare();
}
Meine Klasse PersonComparator
Java:
public class PersonComparator implements Comparator<Person>{
   
    String <Person> compare(){
    }   
}
Meine Klasse Personen
Java:
public class Person {
    private String firstName;
    private String lastName;

    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return this.firstName;
    }

    public String getLastName() {
        return this.lastName;
    }
}
 
J

JustNobody

Das Interface Comparator existiert bereits und das sollst du bestimmt auch verwenden:

Zu deinem Code fällt mir ansonsten kaum etwas ein:
Deine Idee einer compare Methode verstehe ich nicht - keine Parameter und String als Ergebnis? Und die Konstrukte sind teilweise ungültig. String ist z.B. kein generischer Typ so dass String<Person> keinen Sinn ergibt.

Aber der Hinweis hilft dir hoffentlich, denn so bekommst du das richtige Interface, das du nur implementieren musst.
 
W

Wayne139

Ich habe meine Klasse PersonComparator jetzt angepasst. Wie würde ich das hinbekommen, mehrere Personen zu sortieren?
Java:
import java.util.*;

public class PersonComparator implements Comparator<Person>{
    
    public int compare(Person o1, Person o2){
        return o1.getLastName().compareTo(o2.getLastName());
    }   
    
    public static void main(String[] args) {
        Person mm = new Person("M", "M");
        Person zz = new Person("Z","Z");
        Person ee = new Person("E","E");
        System.out.println(zz.compare(mm,zz));
    }   
}
 
J

JennyL

Java:
import java.util.SortedSet;
import java.util.TreeSet;

public class Person implements Comparable<Person> {
	private static SortedSet<Person> persons = new TreeSet<Person>();
	private String firstName;
	private String lastName;

	public Person(String firstName, String lastName) {
		this.firstName = firstName;
		this.lastName = lastName;
	}

	public String getFirstName() {
		return this.firstName;
	}

	public String getLastName() {
		return this.lastName;
	}

	@Override
	public int compareTo(Person o) {
		int i1 = lastName.compareTo(o.lastName);
		if (i1 == 0)
			return firstName.compareTo(o.firstName);
		return i1;
	}

	@Override
	public String toString() {
		return String.format("lastName=%s, firstName=%s", firstName, lastName);
	}

	public static void main(String[] args) {
		persons.add(new Person("Herbert", "Herbert"));
		persons.add(new Person("Nobert", "Nobert"));
		persons.add(new Person("Hubert", "Hubert"));
		persons.forEach(System.out::println);
	}
}
 
J

JustNobody

Dem TE nützt Compareable nichts, wenn die Anforderung explizit Comparator erlangt:
Ich soll eine Klasse PersonComparator erstellen, die eine Schnittstelle Comparator implementiert und mit der compare-Methode
die Sortierung macht
 
W

Wayne139

Ich habe meinen Code nochmal etwas bearbeitet. Macht das so Sinn?
Direkt in der dritten Zeile bekomme ich noch eine Fehlermeldung:
The type PersonComparator must implement the inherited abstract method Comparator<Person>.compare(Person, Person)

Java:
import java.util.*;

public class PersonComparator implements Comparator<Person> {

    public static Comparator<Person> COMPARE_BY_NAME = new Comparator<Person>() {
        public int compare(Person o1, Person o2){
            return o1.getLastName().compareTo(o2.getLastName());
        }
    };
    

    public static void main(String[] args) {
        List<Person> liste = new ArrayList<Person>();

        liste.add(new Person("D", "D"));
        liste.add(new Person("B", "B"));
        liste.add(new Person("A", "A"));
        Collections.sort(liste,Person.COMPARE_BY_NAME);
        
    }
}
 
J

JustNobody

Deine Klasse selbst hat keine compare Methode.

Die vorhandene compare Methode ist in einer neuen anonymen Klasse.

Die Methode muss direkt in der Klasse stehen und die statische Konstante hat nur ein new ...(); ohne geschweifte Klammern!
 
J

JennyL

Dem TE nützt Compareable nichts, wenn die Anforderung explizit Comparator erlangt:
Hm dann vielleicht doch so:
Java:
import java.util.Comparator;
import java.util.SortedSet;
import java.util.TreeSet;

public class Person {
	private static final class ComparingPersonsAlphabeticalComparator implements Comparator<Person> {
		@Override
		public int compare(Person p1, Person p2) {
			int i1 = p1.lastName.compareTo(p2.lastName);
			if (i1 == 0)
				return p1.firstName.compareTo(p2.firstName);
			return i1;
		}
	}

	private static SortedSet<Person> persons = new TreeSet<Person>(new ComparingPersonsAlphabeticalComparator());
	private String firstName;
	private String lastName;

	public Person(String firstName, String lastName) {
		this.firstName = firstName;
		this.lastName = lastName;
	}

	public String getFirstName() {
		return this.firstName;
	}

	public String getLastName() {
		return this.lastName;
	}

	@Override
	public String toString() {
		return String.format("%s, %s", lastName, firstName);
	}

	public static void main(String[] args) {
		persons.add(new Person("Herbert", "Herbert"));
		persons.add(new Person("Nobert", "Nobert2"));
		persons.add(new Person("Nobert", "Nobert"));
		persons.add(new Person("Hubert", "Hubert"));
		persons.forEach(System.out::println);
	}
}
 
Thema: 

Personen sortieren mit Comparator

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben