Datentypen Methode, die booleans vergleicht? (Bluej)

chaoshoney

Mitglied
Hallo, ich habe folgendes Problem. Ich habe eine vorgegebene Klasse namens "Person", die Personen anhand zweier Kritierien definiert: dem Vornamen und dem Geschlecht.
Ich möchte mich jetzt schon einmal dafür entschuldigen, dass die Quelltexte unendlich lang werden.

Java:
import static java.util.Objects.requireNonNull;

/**
* Eine Person hat einen Vornamen und ein Geschlecht.
*/
public class Person
{
    private final String _vorname;
    private final boolean _weiblich;
}
  
/**
  * Initialisiert ein Person-Objekt mit den angegeben Daten.
     */
    public Person(String vorname, boolean weiblich)
    {
        _vorname = requireNonNull(vorname);
         _weiblich = weiblich;
    }

    /**
     * Liefert den Vornamen.
     */
    public String gibVorname()
    {
        return _vorname;
    }
 
 
/**
     * Gibt an, ob die Person weiblich ist.
     */
    public boolean istWeibich()
    {
        return _weiblich;
    }
 
    /**
     * Liefert eine String-Darstellung im Format
     * Maxi (weiblich)
     */
    public String toString()
    {
        return String.format("%s, %s (%d, %s)",  _vorname, _weiblich ? "weiblich" : "männlich");
    }
}

Nun habe ich außerdem diese Klasse Kriterien, die den Personen Namen und Geschlecht zuordnet:
Java:
class Kriterien
{
 
  private final Kriterien[] _urspruenglicheReihenfolge =
  {
  new Person("Karla", false),
  new Person("Tom", true),
  new Person("Marie", false),
  new Person("Konrad", true),
  };

  private Person[] _menschen;
  
  /**
  * Schreibt die Menschen auf die Konsole, geordnet nach einem Kriterium.
  */
  public void schreibeGeordnet(Vergleicher vergleicher)
  {
  _menschen = _urspruenglicheReihenfolge.clone();
  insertionsort(vergleicher);
  System.out.println("========== " + vergleicher.getClass().toString().substring(6) + " ==========");
  for (Person p : _menschen)
  {
  System.out.println(p);
  }
  System.out.println();
  }

  /**
  * Insertionsort
  */
  private void insertionsort(Vergleicher vergleicher)
  {
  for (int i = 1; i < _menschen.length; ++i)
  {
  // Vorbedingung: Die Liste ist von 0 bis i-1 sortiert
  insert(i, vergleicher);
  // Nachbedingung: Die Liste ist von 0 bis i sortiert
  }
  }

  private void insert(int j, Vergleicher vergleicher)
  {
  Person einzufuegen = _menschen[j];
  while ((j > 0) && vergleicher.vergleiche(einzufuegen, _menschen[j - 1]) < 0)
  {
  _menschen[j] = _menschen[j - 1];
  --j;
  }
  _menschen[j] = einzufuegen;
  }
}

Dann existiert ein Interface
Java:
interface Vergleicher
{
  /**
  * Vergleicht zwei Personen miteinander und gibt Auskunft darueber, in welcher Beziehung sie zueinander stehen.
  * Wenn die beiden Personen (gemessem am Vergleichskriterium) gleich sind, dann wird 0 geliefert.
  * Wenn a in einer geordneten Liste vor b stehen wuerde, dann wird irgendeine negative Zahl geliefert.
  * Ansonsten wird irgendeine positive Zahl geliefert.
  */
  public int vergleiche(Person a, Person b);
}

So, nun kommt die erste eigene Klasse, die ich geschrieben habe, nämlich

Java:
public class PerVorname implements Vergleicher
{
  public int vergleiche(Person a, Person b)
  {
  return a.gibVorname().compareTo(b.gibVorname());
  }
}
Dieser sortiert die Personen alphabetisch nach ihren Vornamen.

Und meine Aufgabe ist es nun noch eine weitere Methode zu entwerfen, die ebenfalls das interface Vergleicher implementiert und dieses Mal die Geschlechter vergleicht und die Männer zuerst angibt. Nun streikt aber der Compiler jedes Mal, wenn ich versuche booleans zu vergleichen (was logisch ist). Außerdem kann ich unmöglich booleans an eine int-Methode returnen (ebenfalls logisch). Nun suche ich schon seit zwei Stunden nach einem Weg diese Aufgabe zu lösen. Mir ist schon in den Kopf gekommen, die Wahrheitszustände in integer (also 0 und 1) umzuwandeln, aber auch das will nicht glücken. Kann mir vielleicht irgendjemand hierbei unter die Arme greifen? :(
 
Zuletzt bearbeitet von einem Moderator:

chaoshoney

Mitglied
Okay, also ich bin soeben selbst ein Stück weitergekommen, indem ich herausgefunden habe, dass auch Booleans, mit großem B geschrieben, existieren, die man vergleichen kann. Nun habe ich folgende Methode:
Java:
public class PerGeschlecht implements Vergleicher
{
  public int vergleiche(Person a, Person b)
  {
  Boolean b1 = new Boolean((a.istWeiblich()));
  Boolean b2 = new Boolean((b.istWeiblich()));
  
  return b2.compareTo(b1);
  }
}
Was dann allerdings passiert, ist dass er die weiblichen Personen zuerst ausgibt, anstatt der männlichen. o_O
 
Zuletzt bearbeitet von einem Moderator:

Flown

Administrator
Mitarbeiter
Ist ein wenig ein overkill das mit den Wrapperklassen zu machen (obwohl es auch richtig erscheinen mag). Du solltest das eher selbst schreiben:
Java:
boolean x = a.istWeiblich();
boolean y = b.istWeiblich();
return (x == y) ? 0 : (x ? 1 : -1);
 

chaoshoney

Mitglied
Aaah okay, über den ternären Operator ist das natürlich 5 Mal schlauer! :) Gut, aber wenn ich das so mache, dann gibt er mir nur die weiblichen aus? :/
 

Neue Themen


Oben