# compareTo auf eine Klasse anwenden



## Tyrael (14. Dez 2004)

Guten Tag alle zusammen, 

hab mal eine Frage ich muss für eine Programmier aufgabe einen Suchalgorithmus benutzen der mir jedoch vorgegeben ist 
indem ich einer Klasse "implements Comperator" und "compareTo" benutze. 

Meine Klasse sieht wie folgt aus 


```
class Tierart 
{ 
String Name=""; 
int AnzahlBeine; 
int Gewicht; 
} 

+ Konstruktor und den jeweiligen GetMethoden die einfach nur Name,Anzahl der Beine oder Gewicht zurück geben. 

Von der Klasse Tierart muss ich ca.50-100 Stück erzeugen was ich wie folgt gemacht habe

Ich hab in meiner Mainfunktion : 
Tierart[] a = new Tierart[100]; 

for(int i=0;<100;i++) 
{ 
a[i] = new Tierart("Blablub",i,i+1); 
}
```
 
Blablu ist jetz nur als Platzhalter da, normal steht da dann "Giraffe","Affe","Nashorn" etc.

Ich müsste jetz die Klassen sortieren und weiss ehrlich überhaupt nicht wie. Müsste ja von jeder Tierart kucken ob die Tierart dannach z.B. weniger Beine hat. 
Kann mir vielleicht jemand helfen wäre mal recht geil zuwissen ob einer weiss wie des gehn kann. 

Die Klassen muss ich sortieren wurde mir so vorgegeben. 
Freue mich wenn mir jemand helfen kann. 

Oder gibt es da noch ne andere möglichkeit z.B. die Klasse Tierart so oft zuerzeugen. Danke 

MfG Tyrael

[Edit by foobar: Codetags eingefügt]


----------



## akira (14. Dez 2004)

Hi,

Du must eine Klasse z.B. TierartComparator implements Comparator schreiben und die compare-Methode überschreiben.
Die Tierart-Objekte must Du in dieser Methode nach einem Kriterium vergleichen und folgendes zurückgeben:



> a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.



Das Sortieren ansich übernimmt z.B. die util-Klasse Arrays.


----------



## Tyrael (14. Dez 2004)

Also in der Forschleife stehn natürlich andere Sachen weil ich mir die Daten aus einer Datei auslese. Ist jetz nur als Beispiel gedacht. 

Ich wüsste aber nicht wie ich des aufbaue, weil die Sortierfunktion klinkt irgendwie logisch aber bei dem rest naja


----------



## akira (14. Dez 2004)

Was genau verstehst Du denn nicht, wie Du eine Klasse erstellst, die Comparator implementiert oder wie Du zwei Objekte miteinander vergleichen kannst?  ???:L


----------



## bygones (14. Dez 2004)

bsp um deine Klasse sortierbar zu machen

```
public class Tierart implements Comparable<Tierart> {
  // normaler Code der Klasse

 // methode aus dem interface comparable
 public int compareTo(Tierart otherArt) {
   // sortiert wird nach anzahl der beine... beine sei die variable die die Anzahl der beine speichert.
  // getBeine die Methode die dir die Anzahl der beine zurückliefert
   return beine - other.getBeine();

 // oder kombiniert mit dem Gewicht
  return (beine - other.getBeine) + (gewicht - other.getGewicht());

}
```
du kannst in der compareTo methode das machen was du willst - es muss nur ein int zurück gegeben werden wie es akira erklärte...

Dann kannst du die Klasse in versch. Sortierer stecken[/code]


----------



## Tyrael (15. Dez 2004)

Wie ich eine klasse erstelle mit Comperator weiss ich.

Die Lösung von deathbyaclown find ich zB. gut und erklärt mir auch einiges schon.

Aber mal ne Frage wie ruf ich dann diese Sortierfunktion auf?


Und sollte ich es wirklich als Array vom Typ der Klasse machen die ganzen Variablen mit Werten zufüllen?


----------



## akira (15. Dez 2004)

Du willst also den fertigen Code haben.

Das sehen wir hier eigentlich nicht so gerne.

PS: Schau doch nochmal in der API nach der Klasse java.util.Arrays


----------



## Tyrael (15. Dez 2004)

den fertigen Code nicht. Wie der Suchalgorithmus geht weiss ich ja. Ich würd lieber wissen wie der aufruf is. Weil des versteh ich auch mit der API nicht


----------



## thE_29 (15. Dez 2004)

@dbac: das ist aber schon java 5 oder? das mit den <> Templates?


----------



## bygones (15. Dez 2004)

@the_29: ja ist java1.5 - code für nicht 1.5

```
public class Tierart implements Comparable {
  // normaler Code der Klasse
// methode aus dem interface comparable
public int compareTo(Object otherArt) {
  Tierart otherTier = (Tierart)otherArt;
   // sortiert wird nach anzahl der beine... beine sei die variable die die Anzahl der beine speichert.
  // getBeine die Methode die dir die Anzahl der beine zurückliefert
   return beine - other.getBeine();

// oder kombiniert mit dem Gewicht
  return (beine - other.getBeine) + (gewicht - other.getGewicht());
}
```

@Tyrael:
das schöne bei java sortieren ist eigentlich dass du dich darum nicht kümmern musst (also das aufrufen)...

```
TierArt[] arten = new TierArt[1000];
//füllen des arrays
Arrays.sort(arten);
//nun ist der array sortiert
```


----------



## Tyrael (15. Dez 2004)

Krieg trotzdem noch ne Fehlermeldung.

Ok muss dazu sagen ich bin nicht gerade erfahren in JAVA

Tierarten.java:19: cannot resolve symbol
symbol  : variable Arrays 
location: class Tierarten
  Arrays.sort(arten); 
  ^


```
public class Tierarten Comperable
  {

  public static void main(String[] args)
  {
  Tierart[] arten = new Tierart[9]; 
  
  arten[0] = new Tierart (20);
  arten[1] = new Tierart (11);
  arten[2] = new Tierart (2);
  arten[3] = new Tierart (34);
  arten[4] = new Tierart (59);
  arten[5] = new Tierart (45);
  arten[6] = new Tierart (56);
  arten[7] = new Tierart (22);
  arten[8] = new Tierart (1);
  
  //füllen des arrays 
  Arrays.sort(arten); 
  //nun ist der array sortiert
  }

}

und die zweite

public class Tierart implements Comparable { 
  // normaler Code der Klasse 
// methode aus dem interface comparable 
  int beine;
  
Tierart(int B) {
  beine = B;
  }


public int compareTo(Object otherArt) { 
  Tierart otherTier = (Tierart)otherArt; 
     return beine - otherTier.getBeine(); 
     //return (beine - other.getBeine) + (gewicht - other.getGewicht()); 
}

public int getBeine()
  { return beine ;}
}
```

_edited by thE_29: Code tags eingefügt_


----------



## akira (15. Dez 2004)

Du must die Klasse natürlich auch importieren:


```
import java.util.Arrays;
```


----------



## Tyrael (16. Dez 2004)

dann mal noch eine Frage 

Ich müsste nachLaenge z.B. der Tiere über eine neue Klasse sortieren.

hab bisher folgende Klassen


```
import java.util.Arrays;

public class Tierarten extends nachLaenge
  {

  public static void main(String[] args)
  {
  Tierart[] arten = new Tierart[9]; 
  
  arten[0] = new Tierart (20,29);
  arten[1] = new Tierart (11,83);
  arten[2] = new Tierart (2,98);
  arten[3] = new Tierart (34,87);
  arten[4] = new Tierart (59,81);
  arten[5] = new Tierart (45,82);
  arten[6] = new Tierart (56,1);
  arten[7] = new Tierart (22,44);
  arten[8] = new Tierart (1,52);
  
  //füllen des arrays 
  Arrays.sort(arten); 
  System.out.println("Nach Beinen sortiert");
  //nun ist der array sortiert
  
  for(int i=0;i<9;i++)
      {
      arten[i].ausgeben();
      }

   
  nachlaenge(arten);
  System.out.println("Nach Laenge sortiert");
  for(int i=0;i<9;i++)
      {
      arten[i].ausgeben();
      }

  }
}
```


```
public class Tierart implements Comparable { 
  // normaler Code der Klasse 
// methode aus dem interface comparable 
  int beine;
  int laenge;
  
Tierart(int B) { beine =B ; }

Tierart(int B,int L) {
  beine = B;
  laenge = L;
  }


public int compareTo(Object otherArt) { 
  Tierart otherTier = (Tierart)otherArt; 
     return beine - otherTier.getBeine(); 
     //return (beine - other.getBeine) + (gewicht - other.getGewicht()); 
}

public int getBeine()
  { return beine ;}

public int getLaenge()
  { return laenge ;}

public void ausgeben()
  {     System.out.println("Tierart hat soviele " + beine + " Beine und eine Laenge von " + laenge);  }

}
```


```
import java.util.Arrays;

class nachLaenge extends Tierart {

  public int compareTo(Object otherArt) { 
  Tierart otherTier = (Tierart)otherArt; 
     return laenge - otherTier.getLaenge(); 
     //return (beine - other.getBeine) + (gewicht - other.getGewicht()); 
  }

  public static void nachlaenge(Tierart[] arten)
  {
    Arrays.sort(arten); 
  }


}
```

Irgendwie krieg ich da noch einen fehler aber keine ahnung wieso


----------



## foobar (16. Dez 2004)

> Irgendwie krieg ich da noch einen fehler aber keine ahnung wieso


Und wir sollen jetzt raten welchen?


----------



## Tyrael (16. Dez 2004)

Sorry

.\nachLaenge.java:3: cannot resolve symbol
symbol  : constructor Tierart ()
location: class Tierart
class nachLaenge extends Tierart {
^
1 error


----------



## Tyrael (16. Dez 2004)

Constructor von Tierart hab ich jetz auf public gemacht, geht aber trotzdem noch nicht 

*Nachtrag*

So hab die Klasse jetz umgeschrieben aber er sortiert mir noch nach der Anzahl der Beine und nicht nach der Laenge 


```
import java.util.Arrays;

public class Tierarten //extends nachLaenge
  {

  public static void main(String[] args)
  {
  Tierart[] arten = new Tierart[9]; 
  
  arten[0] = new Tierart (20,29);
  arten[1] = new Tierart (11,83);
  arten[2] = new Tierart (2,98);
  arten[3] = new Tierart (34,87);
  arten[4] = new Tierart (59,81);
  arten[5] = new Tierart (45,82);
  arten[6] = new Tierart (56,01);
  arten[7] = new Tierart (22,44);
  arten[8] = new Tierart (1,52);
  
  //füllen des arrays 
  
  /*Arrays.sort(arten); 
  System.out.println("Nach Beinen sortiert");
  //nun ist der array sortiert
  
  for(int i=0;i<9;i++)
      {
      arten[i].ausgeben();
      }*/

  
  nachLaenge.sortieren(arten);
  /*System.out.println("Nach Laenge sortiert");
  for(int i=0;i<9;i++)
      {
      arten[i].ausgeben();
      }*/

  }
}

public class Tierart implements Comparable
  { 
  // normaler Code der Klasse 
// methode aus dem interface comparable 
  int beine;
  String Test="";
  public int laenge;
  
public Tierart() { Test = "HALLO" ; }
  
public Tierart(int B) { beine =B ; }

public Tierart(int B,int L) {
  beine = B;
  laenge = L;
  }


public int compareTo(Object otherArt) { 
  Tierart otherTier = (Tierart)otherArt; 
     return beine - otherTier.getBeine(); 
     //return (beine - other.getBeine) + (gewicht - other.getGewicht()); 
}

public int getBeine()
  { return beine ;}

public int getlaenge()
  { return laenge ;}

public void ausgeben()
  {     System.out.println("Tierart hat soviele " + beine + " Beine und eine Laenge von " + laenge);  }

}

import java.util.Arrays;

class nachLaenge extends Tierart implements Comparable 
  {

  public int compareTo(Object otherArt , Object otherArt2) { 
  Tierart otherTier = (Tierart)otherArt;
  Tierart otherTier2 = (Tierart)otherArt2; 
     return otherTier.getlaenge() - otherTier2.getlaenge(); 
     //return (beine - other.getBeine) + (gewicht - other.getGewicht()); 
  }

  public static void sortieren(Tierart[] arten)
  {
    Arrays.sort(arten); 
    System.out.println("Nach Laenge sortiert");
  for(int i=0;i<9;i++)
      {
      arten[i].ausgeben();
      }

  }
  }
```

Bin bestimmt wieder nur zu blöd um den fehler zusehn [/code]


----------



## foobar (16. Dez 2004)

In der Methode CompareTo in der Klasse Tierart sagst du doch auch, daß nach der Anzhal der Beine sortiert werden soll. Wofür soll die Klasse nachLaenge gut sein? Wenn du die Klasse nachLaenge zum sortieren verwenden willst, mußt du auch Instanzen dieser Klasse verwenden und nicht Tierart-Objekte.


----------



## foobar (16. Dez 2004)

Am besten verwendest du einen Comparator. Damit kannst du ganz leicht nach verschiedenen Kriterien sortieren ohne, daß du etwas an der Tierart-Klasse ändern mußt:

```
import java.util.*;
import java.util.Arrays;

public class Tierarten //extends nachLaenge
{

	public static void main(String[] args)
	{
		Tierart[] arten = new Tierart[9];

		arten[0] = new Tierart(20, 29);
		arten[1] = new Tierart(11, 83);
		arten[2] = new Tierart(2, 98);
		arten[3] = new Tierart(34, 87);
		arten[4] = new Tierart(59, 81);
		arten[5] = new Tierart(45, 82);
		arten[6] = new Tierart(56, 01);
		arten[7] = new Tierart(22, 44);
		arten[8] = new Tierart(1, 52);
               
               Comparator sortByLength = new Comparator()
		{
			public int compare(Object o1, Object o2)
			{
				Tierart otherTier = (Tierart) o1;
				Tierart otherTier2 = (Tierart) o2;
				return new Integer( otherTier.getlaenge()).compareTo(new Integer( otherTier2.getlaenge()));
			}
		};

		Comparator sortByLegs = new Comparator()
		{
			public int compare(Object o1, Object o2)
			{
				Tierart otherTier = (Tierart) o1;
				Tierart otherTier2 = (Tierart) o2;
				return new Integer( otherTier.getBeine()).compareTo(new Integer( otherTier2.getBeine()));
			}
		};

		Arrays.sort(arten, sortByLength);

		for (int i = 0; i < arten.length; i++)
		{
			System.out.println("Beine: " + arten[i].getBeine() + " Laenge " + arten[i].getlaenge());
		}

	}
}

class Tierart
{
	int beine;
	String Test = "";
	public int laenge;

	public Tierart()
	{
		Test = "HALLO";
	}

	public Tierart(int B)
	{
		beine = B;
	}

	public Tierart(int B, int L)
	{
		beine = B;
		laenge = L;
	}

	/*public int compareTo(Object otherArt)
	{
		Tierart otherTier = (Tierart) otherArt;
		return beine - otherTier.getBeine();
		//return (beine - other.getBeine) + (gewicht - other.getGewicht());
	}*/

	public int getBeine()
	{
		return beine;
	}

	public int getlaenge()
	{
		return laenge;
	}

	public void ausgeben()
	{
		System.out.println("Tierart hat soviele " + beine + " Beine und eine Laenge von " + laenge);
	}

}
```


----------



## KSG9|sebastian (16. Dez 2004)

Ach, noch was zum Thema Konventionen 

Konstruktoren:


```
public Konstruktor(){
        //mach was
    }

//oder

    public Konstruktor()
    {
        //mach was
    }
```

Methoden das gleiche:


```
public void tuWas(){
        //mach was
    }

//oder

    public void tuWas()
    {
        //mach was    
    }
```

Variablen in Klassen


```
class Test{
        private int vari;
        protected int vari;
        public int vari;
        //evtl, static oder final
    }
```


Eine genauere Erklärung zu public, private und protected findest du im FAQ-Bereich.

Durch die Konventionen wird der Code um einiges lesbarer und verständlicher..

MfG

Sebastian


----------



## Tyrael (16. Dez 2004)

schon gut habs jetz 

Und bin auch fertig *freu*

könnt den Thread jetz gerne löschen oder schließen

MfG Tyrael


----------



## bygones (16. Dez 2004)

wir machen beides eher nicht... 
löschen weil vll jemand anders ein ähnliches Problem hat und ne Lösung hier findet, schließen auch nicht, vielleicht gibts doch noch einen Nachtrag....


----------

