Punkte in Arraylist vergleichen und sortieren

empsim

Cadet 4th Year
Registriert
Juli 2018
Beiträge
69
Hallo zusammen,

ich habe eine Aufgabe für mein Fernstudium und bin leider (vor allem Dank der absolut mangelhaften Studienhefte) völlig ratlos. Könnte mir jemand einen kleinen Tipp geben was an diesem Code falsch ist?

Es sind 3 Fehler im Code, 2 habe ich denke ich gefunden, siehe Kommentare.

Das Programm soll Zehn x/y Punkte zufällig erzeugen und vergleichen. erst wird der y-wert von 2 Punkten verglichen, falls diese gleich sind der x-wert. Dann sollen die Punkte vor und nach Sortierung auf der Konsole ausgegeben werden.

Beim Ausführen bekomme ich 10 Punkte mit x,y Werten in der Konsole aber unsortiert, dann den Fehler :

"Ein Ausnahmefehler des Typs "System.InvalidOperationException" ist in mscorlib.dll aufgetreten.

Zusätzliche Informationen: Fehler beim Vergleichen von zwei Elementen im Array."

C#:
using System;
using System.Collections;
public class Point
{
    public int x;
    public int y;
    public Point(int x, int y)
    {
        this.x = x;        //  1: this
        this.y = y;
    }
    public override string ToString()  // 2: override
    {
        return x + "," + y;
    }
}
public class ArrayListTest
{
    public static void Main(string[] args)
    {
        ArrayList AL = new ArrayList();
        Random R = new Random();
        for (int i = 0; i < 10; i++)
        {
            Point p = new Point(R.Next(50), R.Next(50));
            AL.Add(p);
        }
        PrintValues(AL);
        AL.Sort();
        PrintValues(AL);
     }
    public static void PrintValues(IEnumerable myList)
    {
        foreach (Object obj in myList)
            Console.WriteLine("{0}", obj);
        Console.WriteLine();
    }
}
 
Bin zwar kein C# Programmierer aber soviel kann ich dir sagen, du hast bisher 0 Fehler gefunden.

Das sind auch absolute Basics also wenn das nicht in deinen Studienheften steht, dann würde ich mein Geld zurück verlangen.
 
MisC schrieb:
Bin zwar kein C# Programmierer aber soviel kann ich dir sagen, du hast bisher 0 Fehler gefunden.

Das sind auch absolute Basics also wenn das nicht in deinen Studienheften steht, dann würde ich mein Geld zurück verlangen.

Das ist schon die korrigierte Version und sind Fehler die der Debugger angezeigt hat.
 
Okay das macht Sinn. Eventuell die Kommentare etwas großzügiger fassen am besten gerade bei Schulungssachen den alten Code auskommentiert stehen lassen.

Jetzt musst du dem Programm ja nur noch erklären wie man Point Objekte sortiert.
 
Mal so ausgedrückt:
A(1 | 1) B(3 | 0)
Woher soll Sort() wissen welcher Punkt größer ist?

Vielleicht hilft dir dieser Error: ArgumentException: At least one object must implement IComparable.
 
Danke für die Tips

C#:
  public class PointCompare : IComparer   // 3: Methode zum Punkte vergleichen hat gefehlt
    {
        int IComparer.Compare(object x, object y)
        {
            
                Point left = (Point)x;
                Point right = (Point)y;

                if (left.y < right.y) return -1;
                else if (left.y > right.y) return +1;
                else
                {
                    if (left.x < right.x) return -1;
                    else if (left.x > right.x) return +1;
                    else return 0;
                

                 }
        }
    }

Es funktioniert auf jeden Fall. Denkt ihr das ist eine passende Lösung im Sinne der Fehlerkorrektur oder ginge es auch einfacher?
 
Könntest aus der ArrayList eine List machen und dir die Class PointCompare sparen.. ist weniger zum tippen und übersichtlicher, aber ob es einfacher ist.. :p (und das ganze von dir scheint ja ein "Arraytest" zu sein)

C#:
using System;
using System.Collections;
using System.Collections.Generic;

public class Point
{
    public int x;
    public int y;
    public Point(int x, int y)
    {
        this.x = x;        //  1: this
        this.y = y;
    }
    public override string ToString()  // 2: override
    {
        return x + "|" + y;
    }
}
public class ArrayListTest
{
    public static void Main(string[] args)
    {
        var AL = new List<Point>();
        Random R = new Random();
        for (int i = 0; i < 10; i++)
        {
            Point p = new Point(R.Next(50), R.Next(50));
            AL.Add(p);
        }
        PrintValues(AL);

        AL.Sort((left, right) => left.y.CompareTo(right.y) != 0 ? left.y.CompareTo(right.y) : left.x.CompareTo(right.x));

        PrintValues(AL);
        Console.ReadLine();
    }
    public static void PrintValues(IEnumerable myList)
    {
        foreach (Object obj in myList)
            Console.WriteLine("{0}", obj);
        Console.WriteLine();
    }
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: empsim
Zurück
Oben