Diskuze: Polia zoradenie,porovnanie

C# .NET .NET (C# a Visual Basic) Polia zoradenie,porovnanie American English version English version

Avatar
Epoxid
Člen
Avatar
Epoxid:

Zdravím,

vedel by mi niekto prosím vás poradiť

1.ako sa dá zoradiť viac rozmerne pole od najmenšieho po najväčšie číslo

int[,] poleA = new int [5,5] {{3,7,23,38,43},
                                         {12,18,33,40,45}; ...atd

klasické pole viem zoradiť týmto príkazom ...

int poleA = new int [5] {5,12,4,45,32};
Array.Sort(poleA); - na viac rozmerne pole mi to nefunguje :(

existuje na to nejaký príkaz jak napr (Array.Sort), alebo treba na to napísať algoritmus ?

2.ako sa dajú jednoducho porovnať dve polia aby som nemusel vypisovať všetky
súradnice...napr takto - if(poleA[0] == poleB[0......atd])
alebo porovnanie viac rozmerneho pola napr if(poleA[0,0] == poleB[0,0.....atd])

skúšal som to cez for cyklus kde som mal [x,y] polia pekne prešlo , len problém bol v tom že hneď jak našlo zhodu na niektorej súradnici cyklus skončil ,,a ja som potreboval aby ich prešiel všetky a skončil až keď sa budu všetky rovnať...

dopredu sa ospravedlňujem ak som niečo zle popísal, ale som len začiatočník čo ma veľa otázok ...

 
Odpovědět 14.12.2015 17:14
Avatar
Odpovídá na Epoxid
Petr Čech (czubehead):
  1. podle jakého klíče se má to pole řadit? Po sloupcích? Po řádkách?

    obávám se, že si budeš muset napsat vlastní algoritmus.

    podívej se sem, najdeš tam inspiraci: http://stackoverflow.com/…l-array-in-c

  2. bool arraysAreEqual = Enumerable.Se­quenceEqual(po­le1, pole2);
Editováno 14.12.2015 18:18
Nahoru Odpovědět 14.12.2015 18:17
Why so serious? -Joker
Avatar
Posix
Člen
Avatar
Odpovídá na Epoxid
Posix:

1. Spoj to do jednoho pole, seřaď a znovu ulož do 2d pole

Nahoru Odpovědět 14.12.2015 19:14
Proč to dělat jednoduše, když to jde složitě.
Avatar
Antonín Tonini:

Pokud bys chtěl seřadit všechny prvky v tom poli A, tak bys musel udělat něco na způsob toho, co psal Posix. Pokud bys chtěl ale seřadit hodnoty v jednotlivých řádcích, tak jedna z možností je načítat jednotlivé řádky, které postupně budeš řadit a ukládat do nového dvourozměrného pole, a potom ho vrátíš.
Něco jako toto:

//poleA.Sort(out poleA);

public static void Sort(this int[,] data, out int[,] output)
        {
            int xLength = data.GetLength(0);
            int yLength = data.GetLength(1);
            int[,] twoDimension = new int[xLength, yLength];
            for (int x = 0; x < xLength; x++)
            {
                int[] array = new int[yLength];
                for (int y = 0; y < yLength; y++)
                {
                    array[y] = data[x, y];
                }
                Array.Sort(array);
                for (int y = 0; y < yLength; y++)
                {
                    twoDimension[x, y] = array[y];
                }
            }
            output = twoDimension;
        }

U sloupců by sis musel udělat vlastní funkci (tady nemáš Array.Sort), která ti bude porovnávat hodnoty na stejné pozici x, akorát si musíš uvědomit, které hodnoty ve kterém řádku můžeš porovnávat, abys pak náhodou neprohodil { 2, 3, 4 } a {3, 2, 4} jen na základě toho, že ve druhém řádku (poli) je na 2. pozici X - 2 a v prvním 3.

 
Nahoru Odpovědět 14.12.2015 21:16
Avatar
Odpovídá na Antonín Tonini
Antonín Tonini:

Ještě k tomu, co jsem psal. Vlastně si ani nemusíš to nové dvourozměrné pole vytvářet, jen bys přepsal ty hodnoty v původním poli.

 
Nahoru Odpovědět 14.12.2015 21:26
Avatar
Epoxid
Člen
Avatar
Odpovídá na Antonín Tonini
Epoxid:

1. No ja som vytvoril niečo takéto ;D, potreboval som aby sa každý riadok (v ktorom je 5 čísiel) zoradil zvlášť , Antonin ten cod co si poslal je ešte na mňa moc,ale zajtra ho preskúmam , Ďakujem za riešenia

int[] pole1 = new int[5];
int[,] pole2 = new int[2,5];

                // Zoradovanie
                for (int a = 0; a != 2; a++)
                {
                    for (int b = 0; b != 5; b++)
                    {

                        pole1[w] = generacnePole[a, b];
                        w++;
                        z++;
                        if (z == 5)
                        {
                            Array.Sort(pole1);
                            w = 0;
                            for (int x = 0; x != 1; x++)
                            {
                                for (int y = 0; y != 5; y++)
                                {

                                    pole2[x, y] = pole1[w];
                                    w++;

                                }
                            }
                            w = 0;

                        }

                        if (z == 10)
                        {
                            Array.Sort(pole1);
                            w = 0;
                            for (int x = 1; x != 2; x++)
                            {
                                for (int y = 0; y != 5; y++)
                                {
                                    pole2[x, y] = pole1[w];
                                    w++;
                                }
                            }

                           z = 0;
                           w = 0;
                        }

                    }
                }
                w = 0;
                generacnePole = pole2;
 
Nahoru Odpovědět 14.12.2015 21:49
Avatar
Odpovídá na Epoxid
Antonín Tonini:

Tady jsem ti to popsal:

public static void Sort(this int[,] data, out int[,] output)
       {
           //i značí číslo řádku
           //a značí číslo položky v řádku
           int iLength = data.GetLength(0); //Zde získáš délku pole (počet řádku) pomocí metody GetLength(0) s parametrem 0, který označuje 1. pole. Pokud máš tedy int[3,5], tak dostaneš 3 (řádky)
           int aLength = data.GetLength(1); //1 označuje 2. pole (počet položek v řádku)
           for (int i = 0; i < iLength; i++) //Zde procházíš 1. pole (řádky)
           {
               int[] array = new int[aLength]; //Vytvoření pole, jehož délka je rovna počtu položek v řádku
               for (int a = 0; a < aLength; a++) //Zde procházíš každou položku v tom řádku
               {
                   array[a] = data[i, a]; //Zde si na danou pozici v poli array nastavíš hodnotu z řádku, která je na stejné pozici
               }
               Array.Sort(array); //Zde máš metodu na seřazení hodnot
               for (int a = 0; a < aLength; a++) //Po seřazení znovu projedeš řádek a na dané pozice dvourozměrného pole zapíšeš nové hodnoty
               {
                   data[i, a] = array[a];
               }
           }
           output = data; //Zde vracíš upravené pole
       }
 
Nahoru Odpovědět 14.12.2015 22:31
Avatar
abushrek
Člen
Avatar
Odpovídá na Antonín Tonini
abushrek:

Proč používáš v parametrech zbytečně out a komplikuješ to když je začátečník. Měl jsi použít metodu s návratovým typem int[,] místo prázdného.
public static int[,] Sort(int[,] data)
{
//Tvůj kód
int iLength = data.GetLength(0); //Zde získáš délku pole (počet řádku) pomocí metody GetLength(0) s parametrem 0, který označuje 1. pole. Pokud máš tedy int[3,5], tak dostaneš 3 (řádky)
int aLength = data.GetLength(1); //1 označuje 2. pole (počet položek v řádku)
for (int i = 0; i < iLength; i++) //Zde procházíš 1. pole (řádky)
{
int[] array = new int[aLength]; //Vytvoření pole, jehož délka je rovna počtu položek v řádku
for (int a = 0; a < aLength; a++) //Zde procházíš každou položku v tom řádku
{
array[a] = data[i, a]; //Zde si na danou pozici v poli array nastavíš hodnotu z řádku, která je na stejné pozici
}
Array.Sort(array); //Zde máš metodu na seřazení hodnot
for (int a = 0; a < aLength; a++) //Po seřazení znovu projedeš řádek a na dané pozice dvourozměrného pole zapíšeš nové hodnoty
{
data[i, a] = array[a];
}
}
return data;
}

 
Nahoru Odpovědět 19.12.2015 22:08
Avatar
Epoxid
Člen
Avatar
Epoxid:

Ďakujem to zoraďovanie funguje super, ale nepodarilo sa mi rozchodiť to porovnávanie

bool arraysAreEqual = Enumerable.SequenceEqual(pole1, pole2);

píše mi tam error " expected"

 
Nahoru Odpovědět 29.12.2015 17:37
Avatar
Epoxid
Člen
Avatar
Epoxid:

Tak to porovnávanie som nakoniec doriešil predsa len cez for cyklus,, ale ak by mal niekto lepšie riešenie nech napíše :)

public void Porovnanie()
        {
            int number = 0;

            for (int x = 0; x < 5; x++)
            {
                for (int y = 0; y < 2; y++)
                {
                    if (generacnePole[x, y] == zasobnik[x, y])
                    {
                        number++;
                    }
                }
            }

            if (number == 10)
            {
                Console.WriteLine("zhoda");
                rovnost = false;
            }
        }
 
Nahoru Odpovědět 1. ledna 17:07
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.