Skocz do zawartości
mystery

[C#] Sortowanie tablicy 2-wymiarowej

Rekomendowane odpowiedzi

Witam,

 

mam taki problem, że chcę posortować tablicę dwu-wymiarową (intów), ale po dwóch kolumnach, nie tylko po jednej.

Przykład

wejście: {{1,0}, {2,1}, {1,3}, {3,4}}wyjście: {{1,0}, {1,3}, {2,1}, {3,4}}

do tej pory napisałem taki oto kawałek kodu:

ArrayComparer comparer = new ArrayComparer();Array.Sort(tab, comparer);class ArrayComparer : IComparer    {        #region IComparer Members        public int Compare(object x, object y)        {            int[] a = (int[])x;            int[] b = (int[])y;            return (a[0].CompareTo(b[0]));        }        #endregion    }

lecz niestety dla powyższego przykładu zwraca on następujące wartości

wyjście: {{1,3}, {1,0}, {2,1}, {3,4}}

Tablica posortowana jest po pierwszej kolumnie, ale już nie po drugiej. Potrzebuję posortować po obu kolumnach rosnąco.

Język oczywiście C#

 

Może ktoś z Was ma jakiś pomysł jak to poprawić?

 

pozdrawiam

m

 

edit:

 

ok, trochę się pospieszyłem z zakładaniem tego tematu, bo wystarczyło tylko dodać do klasy porównującej jeden warunek i zaczęło działać.

Mimo wszystko może komuś kiedyś się to przyda. Mało kodu i działa. Zapewne nie jest to idealna implementacja sortowania (zgaduję, że to proste porównywanie każdego z każdym), ale jak komuś nie zależy na czasie wykonania i zasobach (ogólnie optymalizacji) to proszę:

class ArrayComparer : IComparer    {        #region IComparer Members        public int Compare(object x, object y)        {            int[] a = (int[])x;            int[] b = (int[])y;            if (a[0] == b[0])            {                return a[1] - b[1];            }                        return (a[0].CompareTo(b[0]));        }        #endregion    }

Acha, moja tablica wyglądała tak: int tab[x][2]: tablica tablic dwuelementowych, ale można tę klasę rozwinąć do dowolnie dużej ilości kolumn :)

Edytowane przez mystery

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zamiast tego return a[1] - b[1]; uniwersalniej byloby return a[1].CompareTo(b[1]);

 

Jako ciekawostke podam jeszcze rozwiazanie z wykorzystaniem Linq:

 

int[][] tab = new int[][] { new int[] { 1, 0 }, new int[] { 2, 1 }, new int[] { 1, 3 }, new int[] { 3, 4 } };var t = (from r1 in tab         orderby r1[0], r1[1]         select r1).ToArray();

Cool, huh? :)

Edytowane przez FiDO

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...