Erste Schritte binarySearch

javapklein

Mitglied
Hallo,

ich habe folgendes Problem. Die Sortierung habe ich geschafft. Beim binarySearch mit oder ohne comparator gibt es folgenden Abbruch.
java.lang.ClassCastException: java.lang.String cannot be cast to Person.
Hier der Code (Abbruch in 95).
Java:
import java.util.Arrays;
import java.util.Comparator;

 class PersonComparatorAuf implements Comparator<Person> {
	 
	   public int compare(Person a1, Person b1) {
	 
	    if (a1.getNachname() == b1.getNachname()) {
	    	if (a1.getVorname().compareTo(b1.getVorname()) == 0) {
	    		if (a1.getGeburtsjahr() < b1.getGeburtsjahr())
	    			return -1;
	    		else
	    			return 1;
	    		}
	       else {
	    	   return a1.getVorname().compareTo(b1.getVorname());
	       }
	    }
	    else if (a1.getNachname() == b1.getNachname()) {
	    	return -1;
	    	}
	    else {
	      return 1;
	    }
	  }
}	
 
 class PersonComparatorAb implements Comparator<Person> {
	 
	    public int compare(Person a1, Person b1) {
	 
	    if (a1.getNachname() == b1.getNachname()) {
	    	if (a1.getVorname().compareTo(b1.getVorname()) == 0) {
	    		if (a1.getGeburtsjahr() < b1.getGeburtsjahr())
	    			return 1;
	    		else
	    			return -1;
	    		}
	       else {
	    	   return (a1.getVorname().compareTo(b1.getVorname()) * -1);
	       }
	    }
	    else if (a1.getNachname() == b1.getNachname()) {
	    	return 1;
	    	}
	    else {
	      return -1;
	    }
	  }
}	  

class Person {
	private String vorname, nachname;
	private int geburtsjahr;
	
	public Person(String nachname, String vorname, int geburtsjahr) {
		this.vorname = vorname;
		this.nachname = nachname;
		this.geburtsjahr = geburtsjahr;
	}	
		
	public String getVorname() {
		return vorname;
	}

	public String getNachname() {
		return nachname;
	}

	public int getGeburtsjahr() {
		return geburtsjahr;
	}

	public String toString() {
		return vorname + ", " + nachname + ". GJ: " + geburtsjahr;
	}
}

public class SortPersonen {

	public static void main(String[] args) {
		
		Person[] arr = {
				new Person("John", "Smith" , 1940),
				new Person("John", "Black" , 1940),
				new Person("John", "Black" , 1920),
		};				
		
		print(arr);					
		//1.Bitte aufsteigend Sortieren (Nach Nachnamen, dann nach Vornamen, und dann nach dem Geburtsjahr
		Comparator comparator = new PersonComparatorAuf();
		Arrays.sort(arr, comparator);
		print(arr);		
		//2. Mit binarySearch nach einer Person (John White, 1960) im Array suchen und Erg. ausgeben
		int position = Arrays.binarySearch(arr, "John White 1960",comparator);
		System.out.println("Suche1 = " + position);
		//3. Mit binarySearch nach einer Person (John Black, 1940) im Array suchen und erg. ausgeben
		//4. Das Array bitte absteigend sortieren (Arrays.sort) wie Aufgabe 1
		Comparator comparator1 = new PersonComparatorAb();
		Arrays.sort(arr, comparator1);
		print(arr);
		//5 Mit binarySearch nach einer Person (John Black, 1940) im Array suchen,
	}
	
	static void print(Person[] arr) {
		for (Person person : arr) {
			System.out.println(person);			
		}
	}	
}
 

javapower

Mitglied
Beim Aufruf von binarySearch musst Du ein Objekt des Typs Person übergeben, z.B.

Person searchP = new Person("John", "Black", 1920);
int position = Arrays.binarySearch(arr, searchP,c);

Kleiner Hinweis: statt

a1.getVorname().compareTo(b1.getVorname()) == 0

geht es auch mit

a1.getVorname().equals(b1.getVorname())
 
Zuletzt bearbeitet:
B

bone2

Gast
die compare funktionen sind größtenteils mist

Java:
       public int compare(Person a1, Person b1) {
     
        if (a1.getNachname() == b1.getNachname()) { // Strings vergleicht man mit stringA.equals(stringB)
            if (a1.getVorname().compareTo(b1.getVorname()) == 0) {
                if (a1.getGeburtsjahr() < b1.getGeburtsjahr())
                    return -1;
                else    // das else ist überflüssig, da im true die methode fall verlassen wird
                    return 1;
                }
           else {    // das else ist auch überflüssig
               return a1.getVorname().compareTo(b1.getVorname());
           }
        }
        else if (a1.getNachname() == b1.getNachname()) { // die gleiche bedingung nochmal im else if nach dem if macht keinen sinn, unerreichbarer code
            return -1;
            }
        else { // und nochmal überflüssig
          return 1;
        }

so wie ich die sache sehe kommt hier praktisch immer 1 raus

[TIPP]
Java:
class PersonComparatorAuf implements Comparator<Person> {
    public int compare(Person a1, Person b1) {
        if (a1.getNachname().equals(b1.getNachname())) {
            if (a1.getVorname().equals(b1.getVorname())) {
                if (a1.getGeburtsjahr() < b1.getGeburtsjahr()) {
                    return -1;
                }
            }
            else {
                return a1.getVorname().compareTo(b1.getVorname());
            }
        }

        return 1;
    }
}
[/TIPP]
 
Zuletzt bearbeitet von einem Moderator:

javapklein

Mitglied
Vielen Dank für die Tipps. Das mit dem Object ist mir klar geworden und die Abfragen sind auch falsch und viel zu umständlich.
Ich habe jetzt eine Lösung.
Java:
import java.util.Arrays;
import java.util.Comparator;

class ComparatorPersonReverse implements Comparator<Person> { //Vergleiche 2 Personen
	public int compare(Person p1, Person p2) {
		return p2.compareTo(p1);
	}	
}

class Person implements Comparable<Person>{ 
	
	private static class ComparatorPersonReverse implements Comparator<Person> {
		public int compare(Person p1, Person p2) {
		return p2.compareTo(p1);
		}	
	}
	//------------------------------------------------
	private static Comparator<Person> reverseComparator;
	
	public static Comparator<Person> reverseComparator() {
		if (reverseComparator == null)
			reverseComparator = new ComparatorPersonReverse();	
		
		return reverseComparator;
	}
	//------------------------------------------------
	
	private String vorname, nachname;
	private int geburtsjahr;
	
	public Person(String vorname, String nachname, int geburtsjahr) {
		this.vorname = vorname;
		this.nachname = nachname;
		this.geburtsjahr = geburtsjahr;
	}
	
	public String toString() {
		return vorname + ", " + nachname + ". GJ: " + geburtsjahr;
	}
	
	public int compareTo(Person p2) {
		int cmp = nachname.compareTo(p2.nachname);	
		
		if(cmp!=0)
			return cmp;
		
		cmp = vorname.compareTo(p2.vorname);
		
		if(cmp!=0)
			return cmp;
		
		return geburtsjahr - p2.geburtsjahr;
	}
}

public class SortPersonen1 {

	public static void main(String[] args) {
		
//		Comparable cmp = new Person("M", "X", 1980);// nicht ein IS-A
//		Comparable cmp = (Comparable)new Person("M", "X", 1980);// nicht ein IS-A
			
		Person[] arr = {
				new Person("John", "Smith" , 1940),
				new Person("John", "Black" , 1940),
				new Person("John", "Black" , 1920),
				new Person("Axel", "Black" , 1920),
		};
		
		//Das personen-Array ausgeben
		print(arr);		
		
		//1.Bitte aufsteigend Sortieren (Nach Nachnamen, dann nach Vornamen, und dann nach dem Geburtsjahr
		Arrays.sort(arr);
		print(arr);		
		//2. Ausgeben
		//3. Mit binarySearch nach einer Person (John White, 1960) im Array suchen und Erg. ausgeben
		int pos = Arrays.binarySearch(arr, new Person("John", "White", 1960));
		System.out.println("Suche1 " + pos);
		pos = Arrays.binarySearch(arr, new Person("John", "Black", 1940));
		System.out.println("Suche2 " + pos);
		//4. Mit binarySearch nach einer Person (John Black, 1940) im Array suchen und erg. ausgeben
		//5. Das Array bitte absteigend sortieren (Arrays.sort) wie Aufgabe 1
		Comparator<Person> cmp = Person.reverseComparator();
		Arrays.sort(arr, cmp);
		print(arr);	
		pos = Arrays.binarySearch(arr, new Person("John", "Black", 1920), cmp);
		System.out.println("Suche3 " + pos);
				
	}
	
	static void print(Person[] arr) {
		System.out.println("--------------------------------");
		for (Person person : arr) {
			System.out.println(person);			
		}
	}	
}
 

Ähnliche Java Themen

Neue Themen


Oben