CLR: .Net / Mono / Boo / Otros CLR > C#

 Trabajar con arrays de distintos tipos de datos(C#)

<< < (2/2)

tannke:
Buenas, tenia por ahi un codigo utilizando el metodo de la burbuja para ordenar cualquier tipo de valor.
En el ejemplo solo están para ordenar en ascendiente y descendiente los tipos "string" y "double", pero si te fijas es muy sencillo añadir todos los demás, solo con crear un metodo booleano comparando cual de los dos valores es mayor.


--- Código: C# --- class Program    {        static void Main(string[] args)        {            //prueba ordenar double ascendente            double[] matriz1 = { 2, 3, 5, 1, 4 };            ClaseMatriz<double>.Burbuja(matriz1, DoubleAscndente);            for (int i = 0; i < matriz1.Length; i++)                Console.Write(matriz1[i] + " ");            Console.WriteLine();             //prueba ordenar double descendiente            double[] matriz2 = { 2, 3, 5, 1, 4 };            ClaseMatriz<double>.Burbuja(matriz2, DoubleDesendiente);            for (int i = 0; i < matriz2.Length; i++)                Console.Write(matriz2[i] + " ");            Console.WriteLine();             //prueba ordenar STRING ascendente            string[] matriz3 = {"bb", "cc", "ee", "aa", "dd"};            ClaseMatriz<string>.Burbuja(matriz3, StringAscendiente);             for (int i = 0; i < matriz3.Length; i++)                Console.Write(matriz3[i] + " ");            Console.WriteLine();             //prueba ordenar STRING descendiente            string[] matriz4 = { "bb", "cc", "ee", "aa", "dd" };            ClaseMatriz<string>.Burbuja(matriz4, StringDescendiente);            for (int i = 0; i < matriz4.Length; i++)                Console.Write(matriz4[i] + " ");            Console.WriteLine();             Console.ReadLine();         }         public static bool DoubleAscndente(double x, double y)        {            return x > y;        }         public static bool DoubleDesendiente(double x, double y)        {            return x < y;        }         public static bool StringAscendiente(string x, string y)        {            return x.CompareTo(y) > 0;        }                public static bool StringDescendiente(string x, string y)        {            return x.CompareTo(y) < 0;        }     }     class ClaseMatriz<Tip>    {        public delegate bool Tipoordenacion(Tip x, Tip y);         public static void Burbuja(Tip[] m, Tipoordenacion comparar)        {            Tip temp;            int i, numElementos = m.Length;            bool s = true;             while (s && (--numElementos > 0))            {                s = false;                 for (i = 1; i <= numElementos; i++)                {                    if(comparar(m[i-1],m[i]))                    {                        temp= m[i-1];                        m[i-1] = m [i];                        m[i]=temp;                        s=true;                    }                }            }        }    }  
Espero te sirva.  Si tienes cualquier duda con el codigo avisa.  Saludos

The_Reaper22:
Eso es justamente lo que quería hacer yo... mil millones de gracias, probaré a adaptar esa idea al código que tengo. Gracias!!

The_Reaper22:
He conseguido hacer funcionar el programa, combinando vuestras ideas, mil gracias. Pero pienso que no está demasiado optimizado... Mi idea sería no utilizar los métodos estáticos en cada algoritmo de ordenación como en el código que me adjuntó tannke, y hacer una clase Ordenación<Tip> que sea clase ancestro de burbuja, inserción, selección.... de modo que no tenga que hacer una llamada distinta para cada algoritmo, y mediante polimorfismo con objeto tipo Ordenación<Tip> pueda instanciar cualquiera de sus descendientes; burbuja, inserción....Las clases que contienen los métodos de ordenación están implementadas tal y como está en el ejemplo de tannke.  Mi main tiene el siguiente aspecto de momento:


--- Código: C# ---static void Main(string[] args)        {            int opcAlgoritmo,tam;            string tipo;                        ProcesadorDatos datosAOrdenar;            int[] vectorInt=null;            double[] vectorDouble=null;            char[] vectorChar=null;            char función;            do            {                NanoTemporizador temporizador = new NanoTemporizador();                opcAlgoritmo = MenúAlgoritmo();                if (opcAlgoritmo != 8)                {                    tipo = MenúTipo();                    tam = MenúTamaño();                    datosAOrdenar = new ProcesadorDatos(tam, tipo);                    datosAOrdenar = MenúModo(tipo, tam);                    función = MenúFunción();                    //creamos el array en función del tipo                    if (tipo.CompareTo("int") == 0)                    {                        vectorInt = new int[tam];                        datosAOrdenar.listaToArray(vectorInt);                    }                    else if (tipo.CompareTo("char") == 0)                    {                        vectorChar = new char[tam];                        datosAOrdenar.listaToArray(vectorChar);                    }                    else                    {                        vectorDouble = new double[tam];                        datosAOrdenar.listaToArray(vectorDouble);                    }                    switch (opcAlgoritmo)                    {                        //Caso de la burbuja                        case 1:                            if (tipo.CompareTo("int") == 0)                            {                                temporizador.Start();                                if (función.CompareTo('A') == 0)                                    Burbuja<int>.Ordenar(vectorInt, Gener.IntAscendente);                                else                                    Burbuja<int>.Ordenar(vectorInt, Gener.IntDescendente);                                temporizador.Stop();                                Burbuja<int>.Mostrar(vectorInt);                            }                            else if (tipo.CompareTo("char") == 0)                            {                                temporizador.Start();                                if (función.CompareTo('A') == 0)                                    Burbuja<char>.Ordenar(vectorChar, Gener.CharAscendente);                                else                                    Burbuja<char>.Ordenar(vectorChar, Gener.CharDescendente);                                temporizador.Stop();                                Burbuja<char>.Mostrar(vectorChar);                            }                            else                            {                                temporizador.Start();                                if (función.CompareTo('A') == 0)                                    Burbuja<double>.Ordenar(vectorDouble, Gener.DoubleAscendente);                                else                                    Burbuja<double>.Ordenar(vectorDouble, Gener.DoubleDescendente);                                temporizador.Stop();                                Burbuja<double>.Mostrar(vectorDouble);                            }                            break;                         //Caso de la burbuja bidireccional                        case 2:                            if (tipo.CompareTo("int") == 0)                            {                                temporizador.Start();                                if (función.CompareTo('A') == 0)                                    BurbujaBidireccional<int>.Ordenar(vectorInt, Gener.IntAscendente);                                else                                    BurbujaBidireccional<int>.Ordenar(vectorInt, Gener.IntDescendente);                                temporizador.Stop();                                BurbujaBidireccional<int>.Mostrar(vectorInt);                            }                            else if (tipo.CompareTo("char") == 0)                            {                                temporizador.Start();                                if (función.CompareTo('A') == 0)                                    BurbujaBidireccional<char>.Ordenar(vectorChar, Gener.CharAscendente);                                else                                    BurbujaBidireccional<char>.Ordenar(vectorChar, Gener.CharDescendente);                                temporizador.Stop();                                BurbujaBidireccional<char>.Mostrar(vectorChar);                            }                            else                            {                                temporizador.Start();                                if (función.CompareTo('A') == 0)                                    BurbujaBidireccional<double>.Ordenar(vectorDouble, Gener.DoubleAscendente);                                else                                    BurbujaBidireccional<double>.Ordenar(vectorDouble, Gener.DoubleDescendente);                                temporizador.Stop();                                BurbujaBidireccional<double>.Mostrar(vectorDouble);                            }                            break;  
La clase ProcesadorDatos la utilizo para insertar elementos en los arrays y para transformar los ArrayList en los arrays del tipo que corresponda. Adjunto algo de código de dicha clase:


--- Código: C# ---namespace MétodosOrdenación{    class ProcesadorDatos    {        private ArrayList lista;        private string tipo;        private int tamaño;         public ProcesadorDatos(int tamaño, string tipo)        {            lista = new ArrayList(tamaño);            this.tipo = tipo;            this.tamaño = tamaño;        }         public void insertaAleatorio()        {            int semilla = System.Convert.ToInt32(DateTime.Now.Millisecond);            if (this.tipo == "int")            {                Console.WriteLine("Introduciendo elementos aleatorios...");                Random rnd = new Random(semilla);                for (int i = 0; i < this.tamaño; i++)                    lista.Add((int)(rnd.NextDouble() * 1000));                               }                        else if (this.tipo == "double")            {                Console.WriteLine("Introduciendo elementos aleatorios...");                Random rnd = new Random(semilla);                for (int i = 0; i < this.tamaño; i++)                    lista.Add((double)(rnd.NextDouble() * 1000));            }            else             {                                Random prRand = new Random(semilla);                Console.WriteLine("Introduciendo elementos aleatorios...");                Random rnd = new Random(semilla);                for (int i = 0; i < this.tamaño; i++)                    lista.Add((char)(prRand.Next(97, 123)));            }        }          public void listaToArray(int[] vectorInt)        {            int posicion = 0;            foreach (Object obj in this.Lista)            {                vectorInt[posicion] = Convert.ToInt32(obj);                posicion++;            }         }         public void listaToArray(double[] vectorDouble)        {            int posicion = 0;            foreach (Object obj in this.Lista)            {                vectorDouble[posicion] = Convert.ToDouble(obj);                posicion++;            }         }         public void listaToArray(char[] vectorChar)        {            int posicion = 0;            foreach (Object obj in this.Lista)            {                vectorChar[posicion] = Convert.ToChar(obj);                posicion++;            }         }  Pienso que tengo bastantes "apaños" en el código y que podría estar más depurado apoyándome en la genericidad utilizando la clase Ordenación<Tip> mencionada y creo que podría también implementar la interfaz IComparable, pero no me desenvuelvo muy bien con la genericidad, agradecería alguna idea.

infa:
Solicito una Ayuda con lo siguiente, por favor.

Crear un arreglo de 10 elementos de listas enlazadas, para guardar números enteros entre 1 y 100. En la posición 0 del arreglo irán todos los números ingresados de menores a 10, en la posición 1 todos los números ingresados mayores o iguales a 10 y menores que 20, en la posición 2 irán todos los números mayores o iguales a 20 pero menores que 30, etc.
 
Una vez ingresados n elementos indicar: de que rango se ingresaron más, buscar un elemento dado y obtener la cantidad de repeticiones de un número dado.

morringos:
Trata de ponerlo en otro post aparte, no dentro del mismo, aparte, especifíca un poco más sobre qué tipo de listas enlazadas, simples, circulares o de cuáles listas.
Si mostraras tu código o tu planteamiento, estaría mejor, para que te podamos decir en qué andas mal y en qué no.


Saludos!;
Morringos Phyps!; ^_^

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa