Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка 
:(
    Опции темы
Real
Дата 20.11.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 507
Регистрация: 9.11.2007

Репутация: 0
Всего: -1



Как сортировать двухмерный  массив?
Код

 Array.Sort(m_sMasiw);


Это сообщение отредактировал(а) Real - 20.11.2007, 23:55
PM   Вверх
thomas
Дата 20.11.2007, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Real, 
Это мы уже проходили.

Неужели не осилил?  smile 



--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Real
Дата 21.11.2007, 00:01 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 507
Регистрация: 9.11.2007

Репутация: 0
Всего: -1



Цитата(thomas @ 20.11.2007,  23:30)
Real, 
Это мы уже проходили.

Неужели не осилил?  smile

Мелкомягие не умеют сортировать двухмерный  массив   .
PM   Вверх
1stain
  Дата 21.11.2007, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 3
Всего: 40



Цитата(Real @  21.11.2007,  00:01 Найти цитируемый пост)
Мелкомягие не умеют сортировать двухмерный  массив 

ну так езжай в Рэдмонд, штат Вашингтон и научи этих ламеров  smile 


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Real
Дата 21.11.2007, 00:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 507
Регистрация: 9.11.2007

Репутация: 0
Всего: -1



PM   Вверх
thomas
Дата 21.11.2007, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Real, 
Да, точно не осилил.  smile 

RTFM = http://search.msdn.microsoft.com/search/De...uery=Array.Sort

Слов нет, одни выражения.  smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
RWander
Дата 21.11.2007, 17:17 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 4.5.2006
Где: Russia.Udm.Izhevs k

Репутация: 1
Всего: 6



Код

int[] sort(int[] m)
{
    for (int i = 0; i < m.length; i++)
       for (int j = i + 1; i < m.length; j++)
          if (m[j] < m[i])
          {
              int tmp = m[j];
              m[j] = m[i];
              m[i] = tmp;
          }
    return m;
}


код для сортировки массива целых чисел, но его без проблем можно адаптировать для любого типа.

Это сообщение отредактировал(а) RWander - 21.11.2007, 17:18


--------------------
Microsoft Certified Technology Specialist - ASP.NET Applications
PM MAIL   Вверх
Real
Дата 22.11.2007, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 507
Регистрация: 9.11.2007

Репутация: 0
Всего: -1



А хачу стандартный метод, я сам умею сортировать в 7 алгоритмах.
PM   Вверх
thomas
Дата 22.11.2007, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



Real, 
Вот тут черным по белому написано
Цитата

Array.Sort -метод (Array)
Сортирует элементы во всем одномерном массиве Array с помощью интерфейса IComparable, реализованного каждым элементом массива Array.

Если не лень то пройдите по всем ссылкам на странички описывающие перегрузки этого метода с этой страницы
И почитайте что и как.

Цитата

А хачу стандартный метод

Как говориться, хотеть не вредно.  smile 

ЗЫ И потом как вы представляете сортировку многомерного массива? Как он по вашему должен сортироваться?

Это сообщение отредактировал(а) thomas - 22.11.2007, 01:21


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
1stain
Дата 22.11.2007, 02:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 3
Всего: 40



сортировать можно jagged массивы (они кстати более производительные)
Код

using MyExtensions;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Random rnd = new Random();
            int[][] jaggedArray = new int[10][];
            for (int i = jaggedArray.GetLowerBound(0); i <= jaggedArray.GetUpperBound(0); ++i)
                jaggedArray[i] = new int[10];

            for (int i = 0; i < 9; ++i)
                for (int j = 0; j < 9; ++j)
                    jaggedArray[i][j] = rnd.Next(100);

            jaggedArray.JaggedArraySort<Int32>();
        }
    }
}

namespace MyExtensions
{
    public static class MySorter
    {
        public static void JaggedArraySort<T> ( this T[][] jaggedArr ) where T : IComparable
        {
            Array.Sort<T[]>(jaggedArr, new JaggedArrayComparer<T>());
        }

        private sealed class JaggedArrayComparer<T> : IComparer<T[]> where T : IComparable
        {
            public JaggedArrayComparer()
            {
            }

            #region IComparer<T[]> Members

            public int Compare(T[] x, T[] y)
            {
                T[] xCopy = new T[x.Length];
                Array.Copy(x, xCopy, x.Length);

                T[] yCopy = new T[y.Length];
                Array.Copy(y, yCopy, y.Length);

                Array.Sort<T>(xCopy);
                Array.Sort<T>(yCopy);

                if (xCopy.Length <= yCopy.Length)
                {
                    for (int i = 0; i < xCopy.Length; ++i)
                        if (xCopy[i].CompareTo(yCopy[i]) != 0)
                            return xCopy[i].CompareTo(yCopy[i]);
                }
                else
                {
                    for (int i = 0; i < yCopy.Length; ++i)
                        if (xCopy[i].CompareTo(yCopy[i]) != 0)
                            return xCopy[i].CompareTo(yCopy[i]);
                }
                return xCopy.Length.CompareTo(yCopy.Length);
            }
            #endregion
        }
    }
}




--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
thomas
Дата 22.11.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



1stain, 
Привет.
А чем плох
Цитата

Array.Sort -метод (Array, Array)

Сортирует пару одномерных объектов Array (один содержит ключи, а другой содержит соответствующие элементы) на основе ключей в первом Array, с помощью интерфейса IComparable, реализованного каждым ключом.

этот метод?
Смотрим тут.

Кста сейчас нарою интересный пример по сортировке. И покажу здесь. Покритикуешь?


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
thomas
Дата 22.11.2007, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



В общем модель ситуации.
Имеем данные:номер, фамилия, имя, дата рождения, порядковый номер.
Хранение данных организовали в структуре. (gegevens)
Для имитации реальных данных используем генерацию чисел и перевод их в слова.
Присваиваем значения элементам структуры, а структуру записываем в ArrayList.
В чем фишка. Реализовав IComparer для каждого типа данных (int, string, datetime)
сортируем данные по колонкам. После сортировки можно найти по имени, фамилии, дате рождения или по порядковому номеру(volgnr).

Как это выглядит
user posted image
Так реализован код clData класс структуры и классы для сравнения.
Код

using System;
using System.Collections;

namespace DataGegevens
{
    public struct gegevens
    {
        public int nr;
        public string naam;
        public string voornaam;
        public DateTime gebdat;
        public long volgnr;
    }
    
    public class VglNr: IComparer
    {
        int IComparer.Compare(object var1, object var2)
        {
            if(var2.GetType()== typeof(gegevens))
                return ((gegevens)var1).nr-((gegevens)var2).nr;
            else
                return ((gegevens)var1).nr-(int)var2;
        }
    }

    public class VglVolgNr: IComparer
    {
        int IComparer.Compare(object var1, object var2)
        {
            if(var2.GetType()== typeof(gegevens))
                return (int)(((gegevens)var1).volgnr-((gegevens)var2).volgnr);
            else
                return (int)(((gegevens)var1).volgnr-(long)var2);
        }
    }

    public class VglNaam: IComparer
    {
        int IComparer.Compare(object var1, object var2)
        {
            if(var2.GetType()== typeof(gegevens))        
                return string.Compare(((gegevens)var1).naam,((gegevens)var2).naam);            
            else        
                return string.Compare(((gegevens)var1).naam,(string)var2);
        }
    }

    public class VglVoorNaam: IComparer
    {
        int IComparer.Compare(object var1, object var2)
        {
            if(var2.GetType()== typeof(gegevens))        
                return string.Compare(((gegevens)var1).voornaam,((gegevens)var2).voornaam);            
            else        
                return string.Compare(((gegevens)var1).voornaam,(string)var2);
        }
    }

    public class VglGebDat: IComparer
    {
        int IComparer.Compare(object var1, object var2)
        {
            if(var2.GetType()== typeof(gegevens))        
                return DateTime.Compare(((gegevens)var1).gebdat,((gegevens)var2).gebdat);            
            else        
                return DateTime.Compare(((gegevens)var1).gebdat,(DateTime)var2);
        }
    }
}


А так выглядит класс самой формы.
Код

                private ArrayList dataTabel=new ArrayList();
        private int ngeg;
        private RadioButton rbtn;
        private const int TABSIZE=500;
        private Byte typenm;
        private IComparer myVgl;

        private void Form1_Load(object sender, System.EventArgs e)
        {
            lstvData.Items.Clear();
            lstvData.View=View.Details;
            lstvData.GridLines=true;
            lstvData.Columns.Add("nr", 40, HorizontalAlignment.Center);
            lstvData.Columns.Add("volgnr", 50, HorizontalAlignment.Right);
            lstvData.Columns.Add("naam", 100, HorizontalAlignment.Left);
            lstvData.Columns.Add("voornaam", 100, HorizontalAlignment.Left);
            lstvData.Columns.Add("gebdatum", 80, HorizontalAlignment.Center);

        }

        private void bttnMake_Click(object sender, System.EventArgs e)
        {
            Tabelgenereren(TABSIZE);
            label2.Text="" + dataTabel.Count + "/" + dataTabel.Capacity;
        }

        private void Tabelgenereren(int aantal)
        {
            Random gen = new Random();
            int loper,getal;
            TimeSpan dat;
            DateTime startdat=new DateTime(1980,1,1);
            ngeg = aantal;
            gegevens el1;

            for( loper = 0;loper< ngeg;loper++)
            {
                getal = gen.Next(1, 998);
                el1.nr=loper;
                el1.naam = Globals.nrToString(getal * loper+1);
                el1.voornaam = Globals.nrToString(getal);
                el1.volgnr = getal;
                dat = new TimeSpan(getal, 0, 0, 0);
                if(getal%2 == 0)
                    el1.gebdat = startdat.Add(dat);
                else
                    el1.gebdat = startdat.Subtract(dat);
                dataTabel.Add(el1);
            }
            tonen();
        }

        private void tonen()
        {
            int index=0;
            lstvData.Items.Clear();
            foreach (gegevens el1 in dataTabel)
            {
                lstvData.Items.Add(el1.nr.ToString());
                lstvData.Items[index].SubItems.Add(el1.volgnr.ToString());
                lstvData.Items[index].SubItems.Add(el1.naam);
                lstvData.Items[index].SubItems.Add(el1.voornaam);
                lstvData.Items[index++].SubItems.Add(el1.gebdat.ToShortDateString());
            }
        }

        private void lstvData_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
        {
            zoekCriterium(e.Column);
            maakKey(e.Column);
            bttnSorteer.Enabled = true;
            chkBin.Checked = false;
        }

        private void maakKey(int kol)
        {
            //int ndx;
            switch(kol)
            {
                case 0:
                    myVgl= new VglNr();
                    typenm = 0; // typenaam integer
                    break;
                case 1:
                    myVgl=new VglVolgNr();
                    typenm = 1; // typenaam long
                    break;
                case 2:
                    myVgl=new VglNaam();
                    typenm = 2; // typenaam string
                    break;
                case 3:
                    myVgl=new VglVoorNaam();
                    typenm = 2; // typenaam string
                    break;
                case 4:
                    myVgl=new VglGebDat();
                    typenm = 3; // typenaam datetime
                    break;
                
            } // typenaam используем в функции поиска 
        }

        private void rbttnBub_CheckedChanged(object sender, System.EventArgs e)
        {
            rbtn=(RadioButton)sender;
        }

        private void zoekCriterium(int kol)
        {
            foreach(RadioButton rb in grpZoek.Controls)
            {
                if(rb.Name == "rbttn" + kol.ToString())
                    rb.Checked = true;
    
            }
        }
        private static int last=0;

        private void SelectAListItem(int itemToSelect)
        {
            lstvData.Items[last].Selected = false;
            if(itemToSelect>=0)
            {
                lstvData.FullRowSelect = true;
                lstvData.Focus();
                lstvData.EnsureVisible(itemToSelect);
                lstvData.Items[itemToSelect].Selected = true;
                last=itemToSelect;
            }
        }

        private void txtZoek_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
        {
            if(e.KeyChar==13)
                zoek(txtZoek.Text);
        }

        private void zoek(string zoekwaarde)
        {
            int vindplaats;
            Object waardeObj=zoekwaarde; // в switch должно быть значение => "=zoekwaarde"
            switch (typenm) // typenamе что мы ищем (int,long,string,datetime)
            {
                case 0:  // typenaam integer
                    waardeObj=Convert.ToInt32(zoekwaarde);
                    break;
                case 1:  // typenaam long
                    waardeObj=Convert.ToInt64(zoekwaarde);
                    break;
                case 2:  // typenaam string
                    waardeObj=zoekwaarde;
                    break;
                case 3:  // typenaam datetime
                    waardeObj=Convert.ToDateTime(zoekwaarde);
                    break;
            }
            if(chkBin.Checked)
            {
                vindplaats = dataTabel.BinarySearch(waardeObj, myVgl);
                lblRes.Text = vindplaats.ToString();
                SelectAListItem(vindplaats);
            }
        }

        private void bttnSorteer_Click(object sender, System.EventArgs e)
        {
            dataTabel.Sort(myVgl);
            tonen();
            chkBin.Checked = true;
            txtZoek.Text="";
            txtZoek.Focus();
        }

        private void btnWissen_Click(object sender, System.EventArgs e)
        {
            int vindpos=Convert.ToInt32(lblRes.Text);
            dataTabel.RemoveAt(vindpos);
            tonen();
        }


Это сообщение отредактировал(а) thomas - 22.11.2007, 10:27


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
1stain
Дата 22.11.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 3
Всего: 40



Цитата(thomas @  22.11.2007,  10:03 Найти цитируемый пост)
А чем плох...

ничем не плох, только причем тут оно? по сути, этот метод сортирует один словарь на основе ключей.

кстате, тот пример, что я привел выше можно было сделать и на 2-м шарпе через свой компарер, а вот такое, только на C# 3.0
Код

        //Еще одна extension функция к предыдущему примеру
        public static void Sort<T>(this T[,] arr) where T : IComparable
        {
            // Воть здесь можно реализовывать хоть все известные алгоритмы сортировки двухмерных массивов вместе взятые

            int firstDimLength = arr.GetLength(0);
            int secDimLength = arr.GetLength(1);

            T[][] jaggedCopy = new T[firstDimLength][];
            for (int i = 0; i < secDimLength; ++i)
            {
                jaggedCopy[i] = new T[secDimLength];
                for (int j = 0; j < secDimLength; ++j)
                    jaggedCopy[i][j] = arr[i,j];
            }

            jaggedCopy.JaggedArraySort<T>();

            for (int i = 0; i < firstDimLength; ++i)
                for (int j = 0; j < secDimLength; ++j)
                    arr[i, j] = jaggedCopy[i][j];
        }
 



--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
thomas
Дата 22.11.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 6
Всего: 65



1stain, 
Интересно.
В ближайшее время попробуем смоделировать и проверить в новой студии. Спасибо.   smile 


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
1stain
Дата 22.11.2007, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

Репутация: 3
Всего: 40



ну и под конец еще один вариант в дополнение к предыдущим smile
Код

        public static void SortMultiDimArray<T>(this Array arr) where T : IComparable
        {
            int dimesions = arr.Rank;
            switch (dimesions)
            {
                case 1:
                    Array.Sort<T>((T[])arr);
                    break;
                case 2:
                    ((T[,])arr).Sort<T>();
                    break;
                default:
                    throw new InvalidOperationException(String.Format("Сортировка массивов размерностью {0} пока что не поддерживается", dimesions));
            }
        }


кстати, тут наверное будет лучше функцию public static void Sort<T>(this T[,] arr) where T : IComparable из предыдущего примера сделать private

Это сообщение отредактировал(а) 1stain - 22.11.2007, 10:56


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0657 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.