Ordinare array bidimensionali

lunedì 01 giugno 2009 - 10.09

ciccioherz Profilo | Junior Member

ciao a tutti,
ho un array bidimensionale tipo questo:
uno - 1
cinque - 5
due - e

dovrei ordinarlo alfabeticamente, tenendo conto del primo indice, ottenendo il seguente risultato:
cinque - 5
due - 2
uno -1

non ho idea di come fare..

aiedail92 Profilo | Expert

Ciao

Non c'è una funzione già pronta per ordinare gli array rettangolari, però non è molto difficile implementarne una.

In questo esempio, ho creato una classe RectangleArraySorter la quale implementa l'interfaccia IComparer. Questa classe ha il compito di comparare gli elementi di un array rettangolare, ordinando però non gli elementi stessi, ma un array contenente gli indici (inizialmente 0,1,2,3,4...) degli elementi. In seguito all'ordinamento questo array contiene gli indici come sono in ordine (per esempio, 2,4,1,0,3...) ed è possibile ricostruire l'array ordinato.

Ecco l'esempio di codice:

private class RectangleArraySorter<T> : IComparer where T : IComparable { private object[,] _array; private int sortCol; private RectangleArraySorter(object[,] theArray, int column) { if (theArray == null) throw new ArgumentNullException("theArray"); if (theArray.Rank != 2) throw new ArgumentException("Deve essere un array bidimensionale"); if (column < 0 || column >= theArray.GetLength(1)) throw new ArgumentOutOfRangeException("column"); this._array = theArray; this.sortCol = column; } public static void Sort(object[,] array, int column) { // Costruisce il Sorter che ordinerà gli elementi RectangleArraySorter<T> sorter = new RectangleArraySorter<T>(array, column); // Costruisce l'array che contiene gli indici degli elementi. // È in realtà questo array che viene ordinato. int h = array.GetLength(0); int[] indexes = new int[h]; for (int i = 0; i < h; i++) indexes[i] = i; // Ordina l'array degli indici Array.Sort(indexes, sorter); // Costruisce il nuovo array, ordinando secondo gli indici int w = array.GetLength(1); object[,] res = new object[h, w]; for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { // Copia il valore nel nuovo array res[i, j] = array[indexes[i], j]; } } // Copia dall'array temporaneo nell'array di partenza for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { array[i, j] = res[i, j]; } } } #region IComparer Membri di int IComparer.Compare(object x, object y) { // x e y sono l'indice delle righe da ordinare int i1 = (int)x; int i2 = (int)y; // Confronta gli oggetti in posizione data return ((T)_array[i1, sortCol]).CompareTo(_array[i2, sortCol]); } #endregion }

Ed ecco come usarlo:

object[,] arr = new object[,] { { "uno", 1 }, { "cinque", 5 }, { "due", 2 } }; // Devi specificare l'indice della colonna che fa da ordinamento: 0 // E il tipo di dati in quella colonna: string RectangleArraySorter<string>.Sort(arr, 0); //// Se avessi voluto ordinare in base al numero, avresti fatto: // RectangleArraySorter<int>.Sort(arr, 1);

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5