Právě je stř říj 24, 2018 7:32 am

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Fórum je zamknuté Toto téma je zamknuté. Nemůžete posílat nové příspěvky ani odpovídat na starší.  [ Příspěvek: 1 ] 
Autor Zpráva
 Předmět příspěvku: Sort array
PříspěvekNapsal: sob led 12, 2013 5:10 pm 
Offline

Registrován: stř kvě 12, 2010 5:31 pm
Příspěvky: 23
Bydliště: Praha 5
Ahoj,
dělám program, kde potřebuji seřadit 2D arraye a mám tu script, který bych vám rád předvedl.

Jde o to, že mám uložená data v arrayích. Uvedu příklad na závodnících. V prvním "sloupci" data[i,0] mám čas závodníka. Tento "sloupec" je klíčový, protože se podle něj seřazují ostatní. Ve druhém sloupci data[i,1] mám jeho jméno, dál obdobným způsobem následuje jeho stáj a nakonec i číslo dresu. Tímto způsobem mám 6(závodníků) x 4(dat) = 24 arrayů. Pro lepší přehled dávám zápis dat z create. Co řádek, to jeden závodník, tedy jeho jméno, čas atd:

Input:
Kód:
data[0,0]="3:15:47"   data[0,1]="Paul Rayon"          data[0,2]="LDD"  data[0,3]=1
data[1,0]="3:10:58"   data[1,1]="Raoul Puyerredon"    data[1,2]="NCS"  data[1,3]=2
data[2,0]="3:14:29"   data[2,1]="Fabian Hoffnung"     data[2,2]="LDD"  data[2,3]=3
data[3,0]="3:13:35"   data[3,1]="Georgios Lalaounis"  data[3,2]="NCS"  data[3,3]=4
data[4,0]="3:11:34"   data[4,1]="Andre Verge"         data[4,2]="LDD"  data[4,3]=5
data[5,0]="3:15:48"   data[5,1]="Manuel Rapidas"      data[5,2]="NCS"  data[5,3]=6


Jak je tedy srovnat podle času, aby v jednom řádku byl odpovídající závodník, jeho stáj i číslo? Na to jsem vymyslel tento script, který je okomentován:

sort_array2(input,output,rows,columns,asc)
Kód:
// Script by Nikolas Charalambidis | NicharCZ

var a, b, c, d, e, n, m, z, list, temp;
a=argument0; // název arraye, kterou chceme srovnat
b=argument1; // název arraye, do které chceme zapisovat (může být stejná)
n=argument2; // počet řádků
m=argument3; // počet sloupců
o=argument4; // 0=sestupně; 1=vzestupně

list=ds_list_create();  // vytvoříme si dočasnou databázi

for (i=0; i<n; i+=1) {               // projedeme všechny řádky
    temp[i]="";                      // deklarujeme dočasnou pomocnou 1D array
    z=0;                             // dočasná proměnná pro zápis řádků
    repeat (m) {                     // opakujeme následující script kolikrát je počet sloupců
        temp[i]+=string(variable_local_array2_get(a,i,z))+"|"; // k temp přidáme sloupec a oddělíme "|"
        z+=1;                        // a pokračujeme dalším řádkem
    }
    temp[i]=string_delete(temp[i],string_length(temp[i]),1);  // na konci nám vysí "|", což se musí odstanit
    ds_list_add(list, temp[i]);      // přidáme scuknutý řádek v jednom stringu do databáze
}

ds_list_sort(list,o);                // kterou pak můžeme seřadit

for (i=0; i<n; i+=1) {               // opět projedeme všechny řádky
    temp[i]=ds_list_find_value(list,i);  // do pomocné array přidáme seřazený scuknutý řádek
                                     // musíme rozdělit seřazený řetězec zpět do arrayů
    c = string(temp[i]) + "|";       // pomocná proměnná na práci s textem
    e=0;                             // další pomocná proměnná pro sloupce
    repeat (string_count("|",c)) {   // opakujem kolikrát je v řetězci oddělovačů "|"
        f = string_pos("|",c)-1;     // pomocná proměnná, která najde pozici oddělovače
        variable_local_array2_set(b,i,e,string_copy(c,1,f));  // vytvoříme novou array (nebo přepíšeme) a vložíme hodnoty
        c = string_delete(c,1,f+1);  // smázneme oddělovače
        e+=1;                        // salší sloupec
    }   
}

ds_list_destroy(list);               // databázi nepotřebujeme, tak pryč s ní

Jak vidíte, celý script pracuje ve 5 jednoduchých krocích.
1. Seskupení řádku do jednoho dlouhého stringu s oddělovařema
2. Zapsání do databáze
3. Seřazení podle kritéria (asc, desc)
4. Převedení seřazených superstringů do arrayů
5. Vytvoření nového arraye se seřazenými hodnotami

Po zavolání funkce v create pod delkarování arrayí array_sort("data","_data",6,4,1);

Output:
Kód:
data[0,0]="3:10:58"   data[0,1]="Raoul Puyerredon"    data[0,2]="NCS"  data[0,3]=2
data[1,0]="3:11:34"   data[1,1]="Andre Verge"         data[1,2]="LDD"  data[1,3]=5
data[2,0]="3:13:35"   data[2,1]="Georgios Lalaounis"  data[2,2]="NCS"  data[2,3]=4
data[3,0]="3:14:29"   data[3,1]="Fabian Hoffnung"     data[3,2]="LDD"  data[3,3]=3
data[4,0]="3:15:47"   data[4,1]="Paul Rayon"          data[4,2]="LDD"  data[4,3]=1
data[5,0]="3:15:48"   data[5,1]="Manuel Rapidas"      data[5,2]="NCS"  data[5,3]=6

Velkou výhodou by mělo být, že jsou data rozdělený do arrayů, takže je pak můžete vložit do nějaký tabulky nebo nějak dál s nimi pracovat (uložit do ini, txt...). Další výhodou je, že všechny hodnoty převádí do stringů, takže je možné řadit data i abecedně.

Předem upozorňuji, že je to poprvé, co jsem používal funkce ds_... a vůbec jsem pracoval s více daty najednou, takže budu rád za jakoukoli opravu scriptů a pomoc ohledně databáze. Script by měl být teoreticky funkční pro celý rozsah arrayů (32000), ovšem počítač zvládne odhadem pár desítek či stovek. Já jsem testoval rozsah 25*10 a vše se rozjelo plynule a prakticky ihned. Samozřejmě doporučuji script dát do create nebo do nějaké události typu zmáčknutí tlačítka. Rozhodně script nepatří jen tak do stepu! Takto můžeme seřadit i 1D arraye, je ale potřeba upravit trochu kód!

V nejbližší době přihodím .gmk soubor, ve kterém je vše názorně předvedeno. Použití scriptu je ovšem tak jednoduché, že se bez něj myslím zatím obejdete :)

Vzhledem, že jsem script patlal nemalou dobu, prosil bych v případě použití, zveřejnit své jméno do credits! :)

_________________
Obrázek


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Fórum je zamknuté Toto téma je zamknuté. Nemůžete posílat nové příspěvky ani odpovídat na starší.  [ Příspěvek: 1 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
cron
Fórum běží na phpBB © 2000, 2002, 2005, 2007 phpBB Group
Český překlad – phpBB.cz
© 2009-2010 Kreveta.net