sortowanie 2-wymiarowych punktow w random ArrayList

0

Hej , mam nastepujacy problem , musze napisac program tworzacy 10 przypadkowych punktow (x,y) i wypisujacy je na tablicy przed i po sortowaniu , morduje sie z tym zadaniem juz kilka godzin wiec prosze forum o pomoc ,
oto moje dotychczasowe wypociny ;


namespace zad2
{

    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }

        public Point(int x, int y)
        {
            this.X = x;
            this.Y = y;
        }
        public string ToString()
        {
            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();
            Console.Read();
        }
    }
}



0

Twój program tworzy przypadkowe punkty - ale tylko o współrzędnych dodatnich - tak więc losowanie trzeba poprawić aby uwzględniało wartości ujemne.
Czy punkt mają zostać posortowane względem współrzędnych czy odległości od punktu S(0,0) ? To znaczy, czy dla punktów: A(-1,-1), B(2,2), C(0,0)
odpowiedź to: C, A, B czy A,C,B ?

0
NeuroXiq napisał(a):

Twój program tworzy przypadkowe punkty - ale tylko o współrzędnych dodatnich - tak więc losowanie trzeba poprawić aby uwzględniało wartości ujemne.
Czy punkt mają zostać posortowane względem współrzędnych czy odległości od punktu S(0,0) ? To znaczy, czy dla punktów: A(-1,-1), B(2,2), C(0,0)
odpowiedź to: C, A, B czy A,C,B ?

przedzial jest od 0 - 50 , czyli dodatnie. Punkty maja byc sortowane pod wzgledem wspolrzednej Y , gdy te beda takie same to ma decydowac wspolrzedna X .
Maja zostac posortowane wzgledem siebie czyli A, C , B .

0
using System;
using System.Collections;
using System.Linq;

namespace zad2
{

    public class Point
    {
        public int X { get; set; }
        public int Y { get; set; }

        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }
        // musi być override (nadpisanie ToString z bazowej klasy object)
        public override string ToString()
        {
            return X + "," + Y;
        }

    }

    class PointComparer : IComparer
    {
        /*
        * 1. Jeżeli x jest większe od y zwróć wartość większą od 0
        * 2. Jeżeli x jest równe y zwróć wartość równą 0
        * 3. Jeżeli x jest mniejsze od y zwróć wartość mniejszą od zera
        */
        public int Compare(object x, object y)
        {
            Point xPoint = x as Point;
            Point yPoint = y as Point;

            int xCompare = xPoint.X - yPoint.X;
            int yCompare = xPoint.Y - yPoint.Y;

            // jeżeli punkty są równe co do współrzędnej 'Y'
            // wtedy zwracamy porównanie 'X' a jeżeli nie to wynik porównania 'Y'
            if (yCompare == 0)
            {
                return xCompare;
            }
            else return yCompare;
        }
    }

    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);
            }
            Console.WriteLine("Before sorting: ");
            PrintValues(AL);

            PointComparer compareRules = new PointComparer();
            AL.Sort(compareRules);

            Console.WriteLine("\nAfter sorting: ");
            PrintValues(AL);
        }

        public static void PrintValues(IEnumerable myList)
        {
            foreach (var item in myList)
            {
                Console.WriteLine(item.ToString());
            }
        }
    }
}

Trzeba do metody Sort przesłać coś, co będzie porównywało dla punkty. Napisałem przykładową klasę implementującą IComparer. Rzuć okiem na kod z moim komentarzem.
Klasa nie jest idealna (brak sytuacji gdzie x/y jest nullem, object zamiast jakiegoś generic itp.) ale na to zadanie wystarczy.
Pozdr.

0

Wow ! dzieki za uratowanie wieczoru , teraz widze swoje bledy jak na tacy ;)
Co do klasy PointComparer i samego algorytmu sortowania musze przyznac, ze malo rozumiem kod ale mam nadzieje ze z czasem dorosne to tematu .
wielkie dzieki ,
Pozdrawiam

0

Przede wszystkim trzeba zmienić ArrayList na List<>.

1 użytkowników online, w tym zalogowanych: 0, gości: 1