Řazení pole dle podmínky
Řazení pole jsem tu již zmiňoval. Drobnou úpravou můžete quicksort funkci upravit, aby nepracovala jen s polem čísel, ale třeba s polem polí a řadit jen podle některých jeho prvků. A nebo se mrkněte, zda se vám nebude hodit BIS_fnc_sortBy
BI do svého seznamu funkcí zařadila hodně variabilní funkci BIS_fnc_sortBy, jejíž autorem by dle popisku v helpu měl být Jiri Wainar.
Funkce přijímá za parametr pole o pěti parametrech.
Prvním je pole, které se má řadit. Druhým jsou speciální parametry,
které můžeme potřebovat do funkce předat (pak jsou dostupné jako
_input0,_input1,…). Často půjde o prázdné pole. Třetí parametr je
algoritmus (funkce), pode kterého bude funkce prvky řadit (výchozí je {_x}).
Čtvrtý parametr je textový řetězec, který popisuje, zda se prvky řadí
vzestupně (ASCEND) nebo sestupně (DESCEND) a pátým je filtrační funkce, kterou můžeme určit, které prvky budou z řazení vyňaty, pokud chceme funkcí prvky i profiltrovat.
Pokud se vrátíme k našemu příkladu s vlastní funkcí a Quicksortem,
pak BIS_fnc_sortBy by se volal:
_arr = [1,2,300,5,125,7,54478,7,89,54,54,4,58,8,94,4,540];
[_arr,[]] call BIS_fnc_sortBy;
hint format ["%1",_arr];
Ideální je samozřejmě použít ji při složitějších podmínkách.
Například pokud máme seznam aut a chceme zjistit, které je nejbližší, pak
můžeme například použít:
_closestCar = [[car1,car2,car3],[],{player distance _x},"ASCEND"] call BIS_fnc_sortBy;
a nebo obdobně pokud chceme najít nejvzdálenější nepojízdné auto
vůči někomu, kdo bude teprve předán třeba jako parametr do funkce:
celo_fnc_findCarForDelete = {
_unit = _this;
[car1,car2,car3],[_unit],{_input0 distance _x},"DESCEND",{!canMove _x}] call BIS_fnc_sortBy;
};
deleteVehicle ((leader player) call celo_fnc_findCarForDelete);
Jistě sami najdete vlastní uplatnění této funkce.