Klassen-Sortierung nach 2 x int[]

dzyan

Mitglied
Hallo !


Ich habe ein Problem. Ich habe eine Klasse manschaften geschrieben mit mannschaften.punkte und mannschaften.torDiff. Ich kann zwar nach punkte sortieren, kriege aber die punkte-Sortierung nicht auf das ganze Klassen-Array hin - eben nur auf die punkte-Spalte. Und habe überhaupt keine keine Ahnung wie dann auch noch zusätzlich nach der torDiff sortiert werden soll (beides int[]-Klassen-Werte).

Klasse:
---------

public DrehFB(int in, String m, int s, int g, int b, int t, int p)
{
index = in;
mannschaft = m;
spiele = s;
gTore = g;
bTore = b;
torDiff = t;
punkte = p;
}

static DrehFB[] mannschaften = new DrehFB[MANNSCHAFTEN_MAX];


Sortierung:
-------------

static int ordnenTabelle(int mNr)
{
int[] puffer = new int[mNr];

for (int p = 0; p < mNr; p++)
{
puffer[p] = mannschaften[p].punkte;
}

Arrays.sort(puffer);

for (int o = 0, p = (mNr - 1); p >= 0; p--, o++)
{
DrehFB dummy = mannschaften[o];
mannschaften[o] = mannschaften[puffer[p]];
mannschaften[puffer[p]] = dummy;
}

return mNr;
}

... die letzte For-Schleife kann man vergessen, die ist 100 %ig falsch.
Mir fällt nur nicht die richtige ein - oder bin ich hier überhaupt falsch unterwegs ?


Danke im voraus
Dzyan
 
Hallo Dzyan,

ich denke, das einzige Problem ist, dass du keinen selbstdefinierten Comparator benutzt.
Die Klasse DrehFB würde dann ungefähr folgendermaßen aussehen:

Java:
import java.util.Arrays;
import java.util.Comparator;

public class DrehFB {
   public int index;
   public String mannschaft;
   public int spiele;
   public int gTore;
   public int bTore;
   public int torDiff;
   public int punkte;

   public DrehFB(int in, String m, int s, int g, int b, int t, int p) {
      index = in;
      mannschaft = m;
      spiele = s;
      gTore = g;
      bTore = b;
      torDiff = t;
      punkte = p;
   }

   public static void ordnenTabelle(DrehFB[] mannschaften) {
      Arrays.sort(mannschaften, new Comparator<DrehFB>() {
         public int compare(DrehFB o1, DrehFB o2) {
            if(o1.punkte < o2.punkte) {
               return -1;
            } else if(o1.punkte > o2.punkte) {
               return 1;
            }

            return 0;
         }
      });
   }
}

Main-Klasse:

Java:
DrehFB[] mannschaften = new DrehFB[MANNSCHAFTEN_MAX];

mannschaften[0] = new DrehFB(0, "Team1", 2, 3, 1, 2, 3);
mannschaften[1] = new DrehFB(1, "Team2", 2, 3, 1, 2, 5);
mannschaften[2] = new DrehFB(2, "Team3", 2, 3, 1, 2, 1);
mannschaften[3] = new DrehFB(3, "Team4", 2, 3, 1, 2, 4);
//...

DrehFB.ordnenTabelle(mannschaften);

Hier würde ich die Klassen- und Methodennamen noch mal ein wenig überdenken.

Zudem würde ich dir vorschlagen ein Tutorial oder Buch über objektorientierte Programmierung durchzulesen, wenn du bereits versuchst, sie anzuwenden. Kann sicher nicht schaden ;)

Viele Grüße,
MAN
 
Zuletzt bearbeitet von einem Moderator:
Danke für die prompte Lösung. Sortiert nur umgekehrt.
Sollte deswegen heißen:

if(o1.punkte > o2.punkte)
{ return -1; }

else if(o1.punkte < o2.punkte)
{ return 1; }
return 0;


Jetzt wird nur nach Punkten sortiert.

Für die 2 Sortierung muss man wahrscheinlich nach der ersten Sortierung
das Gleiche nochmals machen - und diesmals für die torDiff:

Arrays.sort(mannschaften, new Comparator<DrehFB>()
{
public int compare(DrehFB o1, DrehFB o2)
{

if(o1.torDiff > o2.torDiff)
{ return -1; }

else if(o1.torDiff < o2.torDiff)
{ return 1; }
return 0;
}
} );
 
>>Hier würde ich die Klassen- und Methodennamen noch mal ein wenig überdenken.

>>Zudem würde ich dir vorschlagen ein Tutorial oder Buch über objektorientierte Programmierung >>durchzulesen, wenn du bereits versuchst, sie anzuwenden. Kann sicher nicht schaden

habe schon einige Bücher durchgearbeitet.
Nach diesen Büchern wird der Methodenname so geschrieben:

anfangEnde()

Klassennamen beginnen den Büchern nach groß

Test oder:
TestDB
 
Zuletzt bearbeitet:
Für die 2 Sortierung muss man wahrscheinlich nach der ersten Sortierung
das Gleiche nochmals machen - und diesmals für die torDiff:

Wenn du es auf diese Weise machst, sei dir bewusst, dass du erst nach torDiff und dann nach punkte sortieren müsstest ;)

habe schon einige Bücher durchgearbeitet.
Nach diesen Büchern wird der Methodenname so geschrieben:

anfangEnde()

Klassennamen beginnen den Büchern nach groß

Test oder:
TestDB

War in erster Linie an den Klassennamen gerichtet. DrehFB ist für eine Klasse nicht gerade aussagekräftig. Ein Name wie Team oder auch Mannschaft wäre an dieser Stelle finde ich ganz passend :)

Zudem ist das Kapitel Datenkapselung sicher auch sehr interessant. ;)
Bitte nicht falsch verstehen, will dir nur ein paar Tipps mit auf den Weg geben ;)

Viele Grüße,
MAN
 
... jetzt verstehe ich erst was Du meinst. Dazu muss ich folgendes klarstellen
(das ging aus diesem kurzem Abschnitt nicht hervor). Hier geht es nicht nur um die Mannschaften selber, sondern um ein komplettes Drehfußball-Turnier-Programm (mit Mannschafts-Eingabe, dann die Auslosung, dann die ersten Spiele, dann die Lucky-Looser-Auslosung, dann die nächsten Spiele bis zum Finale (immer mit Tabellen-Anzeige, usw.)

Habe vor, das Ganze zuerst als Command_Line-Proigramm, zu schreiben und erst dann
als Grafik-Programm (weil ich für die Grafik erst noch ein Buch brauche, das kann ich noch nicht (Empfehlung ?). Ob das der richtige Weg ist, zuerst Command_Line und dann erst Grafik ?

Hier wäre dann auch noch interessant was hierbei besser ist: AWT oder Swing ?


LG
dzyan
 
Hier geht es nicht nur um die Mannschaften selber, sondern um ein komplettes Drehfußball-Turnier-Programm (mit Mannschafts-Eingabe, dann die Auslosung, dann die ersten Spiele, dann die Lucky-Looser-Auslosung, dann die nächsten Spiele bis zum Finale (immer mit Tabellen-Anzeige, usw.)

Was nicht heißt, dass die Klasse Mannschaft so abwägig für dein Vorhaben ist ;)
Dein Programm wird ja hoffentlich nicht nur aus dieser einen Klasse bestehen, oder? ;)

Habe vor, das Ganze zuerst als Command_Line-Proigramm, zu schreiben und erst dann
als Grafik-Programm (weil ich für die Grafik erst noch ein Buch brauche, das kann ich noch nicht (Empfehlung ?). Ob das der richtige Weg ist, zuerst Command_Line und dann erst Grafik ?
Bevor du überlegst, ob du es grafisch oder "textuell" anzeigst, würde ich die OOP weiter vertiefen. Wenn du ein gutes Klassenkonzept hast und es auch gut implementierst, kannst du viel einfacher von Kommandozeile auf bunte Fenster wechseln.
Um beim Entwickeln zu testen, ob dein Programm auch das richtige macht, wäre ein Konsolenprogramm die effizientere Variante Fehler zu finden. Wenn du direkt mit grafischer Programmierung anfängst, wendest du alleine für die Gestaltung viel zu viel Zeit auf, bevor der eigentliche Kern des Programms (die Logik) funktioniert.

Hier wäre dann auch noch interessant was hierbei besser ist: AWT oder Swing ?

Das mag vielleicht Geschmackssache sein. Ich bevorzuge für meine Bedürfnisse SWT (ja, es gibt noch andere neben AWT und Swing :)). SWT bietet ein paar mehr Möglichkeiten für die Oberflächengestaltung. Zudem finde ich persönlich die Implementierung einfacher.

Viele Grüße,
MAN
 

Neue Beiträge

Zurück