mystery Opublikowano 29 Kwietnia 2010 Zgłoś Opublikowano 29 Kwietnia 2010 (edytowane) 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 29 Kwietnia 2010 przez mystery Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Gość Opublikowano 29 Kwietnia 2010 Zgłoś Opublikowano 29 Kwietnia 2010 (edytowane) 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 29 Kwietnia 2010 przez FiDO Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
mystery Opublikowano 29 Kwietnia 2010 Zgłoś Opublikowano 29 Kwietnia 2010 Dzięki FiDO, taaa Linq jest cool :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...