PDA

Просмотр полной версии : двумерный массив


: hr :
09.12.2003, 16:17
Друзья, помогите, что-то прямо творческий кризис настал :-(
Нужно упорядочить двумерный массив координат чтобы получилось так:

элементы должны идти сначала по возрастанию x, потом у...

допустим:
y1=-30;x1=0;
y2=-30;x2=10;
y3=-30;x3=20;
y4=-30;x4=30;

y5=-20;x5=0;
y6=-20;x6=10;
y7=-20;x7=20;
y8=-20;x8=30;

y9=-10;x9=0;
y10=-10;x10=10;
y11=-10;x11=20;
y12=-10;x12=30;

for (i=1; i<mass.length; i++) {
координата x записана в массиве mass[i][0]
координата y mass[i][1]
}

Заранее спасибо!!! Пиво с меня! ;)

Usnul
09.12.2003, 16:34
legche sostavljat' massiv kak popalo, a potom formatirovat', 'to prosche, i v plane vesaq, i v plane skorosti.

Techmaker
09.12.2003, 16:53
for(mass=[],i=0,y=-30;y<=-10;y+=10){
for(x=0;x<=30;x+=10,i++){
mass[i]=[];
mass[i][0]=x;
mass[i][1]=y;
};
};
for(i2=0;i2<i;i2++){
trace(mass[i2]);
};

Techmaker
09.12.2003, 17:00
mass_x=[12,56,48,21,36];
mass_y=[542,226,40,58,0];
mass_x.sort(function(){return(arguments[0]>arguments[1]);});
mass_y.sort(function(){return(arguments[0]>arguments[1]);});
mass=[];
for(i in mass_x){mass[i]=[mass_x[i],mass_y[i]];};
for(i=0;i<mass.length;i++){trace(mass[i]);};

сортировка :)

: hr :
09.12.2003, 18:59
так у меня массив и составляется как попало! это я для примера написал, главное - мне нужно упорядочить его по правилу, написанному в таблице.

Techmaker, У Вас сортируется по возрастанию mass_x и mass_y, а потом выводятся, а это же связанные значения, т.е.
не должно быть в начале

[12,56,48,21,36];
[542,226,40,58,0];

а потом

12,0
21,40
36,58
48,226
56,542

нужно - берем самое маленькое значение y - для него выводим по мере возрастания x (в случае наличия нескольких x с одинаковым y) - это сформировались n певых значений выходного массива

дальше взяли следующее по величине значение y - для него вывели x по мере возрастания...

и т.д. - посмотрите внимательно, пожалуйста, в пример который я привел!

HELP!!!

Jlekc
09.12.2003, 19:25
Тебе обязательно делать сортировку в AS 1, может AS2 подойдет ??

Jlekc
09.12.2003, 19:59
Я тут глянул функция 'sortOn' введена с шестёрки, так что этот сурс подойдет


arr = [];
arr[0] = {x:1, y:10};
arr[1] = {x:2, y:30};
arr[2] = {x:5, y:10};
arr[3] = {x:3, y:10};
arr[4] = {x:2, y:20};
arr[5] = {x:3, y:20};
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}
arr.sortOn(["x", "y"]);
trace('after');
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}


если подошол жду обещенной награды :D

: hr :
09.12.2003, 22:16
Млин!!!!! Наверное я что-то объясняю не правильно... :-( Jlekc огромное спасибо, что пытаетесь помочь, награда будет, но
у Вас:

x : 1 | y : 10
x : 2 | y : 30
x : 5 | y : 10
x : 3 | y : 10
x : 2 | y : 20
x : 3 | y : 20
after
x : 1 | y : 10
x : 3 | y : 20
x : 2 | y : 20
x : 3 | y : 10
x : 5 | y : 10
x : 2 | y : 30


а мне нужно:

after
x : 1 | y : 10
x : 3 | y : 10
x : 5 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 2 | y : 30

Видите в чем разница? Сначала для наименьшего y(10) перебираются по-возрастанию все x(1,3,5),
потом для следующего по величине y(20) - все x по возрастанию(2,3), затем для следующего y(30) и т.д.

Я уже голову сломал - никак не получается :(

Jlekc
10.12.2003, 11:52
посмотри в синтаксис 'sortOn', можно делать сортировку по любому элементу. Я написал sortOn([ "x" , "y" ]) как общий пример.
А тебе надо sortOn([ "y", "x" ]). Извини упустил :)

Techmaker
10.12.2003, 16:06
вот сделал, основываясь на примере Jlekc'а
arr = [];
arr[0] = {x:1, y:10};
arr[1] = {x:2, y:30};
arr[2] = {x:5, y:10};
arr[3] = {x:3, y:10};
arr[4] = {x:2, y:20};
arr[5] = {x:3, y:20};
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}
arr.sort(function(){return(arguments[0].y>arguments[1].y)});
trace('after');
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}

: hr :
10.12.2003, 18:07
Ой, ребята... Сейчас заплачу! :-(


Techmaker, берем Ваш скрипт:

x : 1 | y : 10
x : 2 | y : 30
x : 5 | y : 10
x : 3 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 5 | y : 20
x : 1 | y : 20
x : 6 | y : 30
x : 0 | y : 30
after
x : 1 | y : 10
x : 3 | y : 10
x : 5 | y : 10
вот до сюда все ОК

x : 1 | y : 20
x : 5 | y : 20
x : 3 | y : 20
x : 2 | y : 20
x : 0 | y : 30
x : 6 | y : 30
x : 2 | y : 30


а дальше? "y" размещаются верно, а x... почему для y=20 x идут 1,5,3 - нужно ведб 1,3,5
то же для y=30 - почему x 0,6,2 ведь надо 0,2,6!!!!

Jlekc
10.12.2003, 18:22
Я же написал. В моем коде:

arr.sortOn(["x", "y"]) замини на arr.sortOn(["y", "x"])

Сортировка роботает нормально !!!

всё еще жду... :D

: hr :
10.12.2003, 19:29
Jleks, заменил. Код такой:

arr = [];
arr[0] = {x:1, y:10};
arr[1] = {x:2, y:30};
arr[2] = {x:5, y:10};
arr[3] = {x:3, y:10};
arr[4] = {x:2, y:20};
arr[5] = {x:3, y:20};
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}
arr.sortOn(["x", "y"]);
trace('after');
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}


выводит:
x : 1 | y : 10
x : 2 | y : 30
x : 5 | y : 10
x : 3 | y : 10
x : 2 | y : 20
x : 3 | y : 20
after
x : 1 | y : 10
x : 3 | y : 20
x : 2 | y : 20
x : 3 | y : 10
x : 5 | y : 10
x : 2 | y : 30


а надо:
x : 1 | y : 10
x : 3 | y : 10
x : 5 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 2 | y : 30

Jlekc
10.12.2003, 19:34
Меня ктонить слишит :D :D :D

ЗАМИНИ arr.sortOn(["x", "y"]); на arr.sortOn(["y", "x"]);

: hr :
10.12.2003, 21:36
заменил

arr = [];
arr[0] = {x:1, y:10};
arr[1] = {x:2, y:30};
arr[2] = {x:5, y:10};
arr[3] = {x:3, y:10};
arr[4] = {x:2, y:20};
arr[5] = {x:3, y:20};
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}
arr.sortOn(["y", "x"]);
trace('after');
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}

выводит
x : 1 | y : 10
x : 2 | y : 30
x : 5 | y : 10
x : 3 | y : 10
x : 2 | y : 20
x : 3 | y : 20
after
x : 1 | y : 10
x : 3 | y : 20
x : 2 | y : 20
x : 3 | y : 10
x : 5 | y : 10
x : 2 | y : 30

:-(

: hr :
10.12.2003, 22:33
Господа, ну неужели на форуме нет ни одного человека, который может мне помочь? Ну помогите начинающему, пожалуйста - для меня это очень важно!!! :o

Usnul
10.12.2003, 22:57
и бы предложил создавать сортировщик ручками, может вечерком сделаю.

: hr :
10.12.2003, 23:29
Usnul, очень надеюсь!

iLoveYou
10.12.2003, 23:31
arr = [];
arr.push({x:1, y:8});
arr.push({x:3, y:4});
arr.push({x:9, y:5});
arr.push({x:2, y:9});
arr.push({x:5, y:2});
arr.push({x:7, y:6});
arr.push({x:8, y:3});
arr.push({x:4, y:1});
arr.push({x:6, y:7});
arr_len = arr.length;
function sortarr(par) {
for (var i = 0; i<arr_len; i++) {
for (var k = i+1; k<arr_len; k++) {
if (arr[i][par]>arr[k][par]) {
sx = arr[i].x;
sy = arr[i].y;
arr[i].x = arr[k].x;
arr[i].y = arr[k].y;
arr[k].x = sx;
arr[k].y = sy;
}
}
}
}
function printarr() {
for (var i = 0; i<9; i++) {
trace("x : "+arr[i].x+" | "+"y : "+arr[i].y);
}
}
printarr();
trace("=======");
sortarr("x");
printarr();
trace("=======");
sortarr("y");
printarr();

Jlekc
11.12.2003, 11:58
Ну чувак или у тя Флеш глючит :p , или ... кстати какая у тя версия

У меня трасирует:

x : 1 | y : 10
x : 2 | y : 30
x : 5 | y : 10
x : 3 | y : 10
x : 2 | y : 20
x : 3 | y : 20
after
x : 1 | y : 10
x : 3 | y : 10
x : 5 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 2 | y : 30

это то 4ё те надо ???

код прежний

arr = [];
arr[0] = {x:1, y:10};
arr[1] = {x:2, y:30};
arr[2] = {x:5, y:10};
arr[3] = {x:3, y:10};
arr[4] = {x:2, y:20};
arr[5] = {x:3, y:20};
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}
arr.sortOn(["y", "x"]);
trace('after');
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}

может кто проверит сурс, а то я не понимаю юмара :rolleyes:

Jlekc
11.12.2003, 12:45
Я работал MX 2004
там стоят фильтры на прием аргументов возможно в 6-ки это и вызывает глюк

Попробуй убери скобки:
вместо arr.sortOn(["y", "x"]);
напиши arr.sortOn("y", "x");
Нет подрукой 6-ки чтоб проверить, но должно сработать

Если сработает назовите меня Super Mega Gosu Отцом :D :D :D

nuran
11.12.2003, 15:01
Оригинал написал(а) Sergey"iLoveYou"
arr = [];
arr.push({x:1, y:8});
arr.push({x:3, y:4});
arr.push({x:9, y:5});
arr.push({x:2, y:9});
arr.push({x:5, y:2});
arr.push({x:7, y:6});
arr.push({x:8, y:3});
arr.push({x:4, y:1});
arr.push({x:6, y:7});
arr_len = arr.length;
function sortarr(par) {
for (var i = 0; i<arr_len; i++) {
for (var k = i+1; k<arr_len; k++) {
if (arr[i][par]>arr[k][par]) {
sx = arr[i].x;
sy = arr[i].y;
arr[i].x = arr[k].x;
arr[i].y = arr[k].y;
arr[k].x = sx;
arr[k].y = sy;
}
}
}
}
function printarr() {
for (var i = 0; i<9; i++) {
trace("x : "+arr[i].x+" | "+"y : "+arr[i].y);
}
}
printarr();
trace("=======");
sortarr("x");
printarr();
trace("=======");
sortarr("y");
printarr();

Ну а кудаж без Сергея то ..., естественно он тут как тут. Любимая тема...

: hr :
11.12.2003, 18:07
Sergey"iLoveYou",

arr = [];
arr.push({x:1, y:8});
arr.push({x:1, y:5});
arr.push({x:1, y:9});
arr.push({x:1, y:7});
arr.push({x:1, y:6});
arr.push({x:1, y:1});
arr.push({x:3, y:4});
arr.push({x:9, y:5});
arr.push({x:2, y:9});
arr.push({x:5, y:2});
arr.push({x:7, y:6});

arr_len = arr.length;
function sortarr(par) {
for (var i = 0; i<arr_len; i++) {
for (var k = i+1; k<arr_len; k++) {
if (arr[i][par]>arr[k][par]) {
sx = arr[i].x;
sy = arr[i].y;
arr[i].x = arr[k].x;
arr[i].y = arr[k].y;
arr[k].x = sx;
arr[k].y = sy;
}
}
}
}
function printarr() {
for (var i = 0; i<11; i++) {
trace("x : "+arr[i].x+" | "+"y : "+arr[i].y);
}
}
printarr();
trace("=======");
sortarr("x");
printarr();
trace("=======");
sortarr("y");
printarr();

выводит:


x : 1 | y : 8
x : 1 | y : 5
x : 1 | y : 9
x : 1 | y : 7
x : 1 | y : 6
x : 1 | y : 1
x : 3 | y : 4
x : 9 | y : 5
x : 2 | y : 9
x : 5 | y : 2
x : 7 | y : 6
=======
x : 1 | y : 8
x : 1 | y : 5
x : 1 | y : 9
x : 1 | y : 7
x : 1 | y : 6
x : 1 | y : 1
x : 2 | y : 9
x : 3 | y : 4
x : 5 | y : 2
x : 7 | y : 6
x : 9 | y : 5
=======
x : 1 | y : 1
x : 5 | y : 2
x : 3 | y : 4
x : 1 | y : 5
x : 9 | y : 5
x : 7 | y : 6
x : 1 | y : 6
x : 1 | y : 7
x : 1 | y : 8
x : 1 | y : 9
x : 2 | y : 9


:( :( :( :(

Flash 6 MX

Jlekc
11.12.2003, 18:16
Слишь hr
Пробывал убрать скобки:
вместо arr.sortOn(["y", "x"]);
напиши arr.sortOn("y", "x");

жутко интиресно :)

: hr :
11.12.2003, 18:46
Jlekc,

arr = [];
arr[0] = {x:1, y:10};
arr[1] = {x:2, y:30};
arr[2] = {x:5, y:10};
arr[3] = {x:3, y:10};
arr[4] = {x:2, y:20};
arr[5] = {x:3, y:20};
arr[6] = {x:7, y:20};
arr[7] = {x:4, y:20};
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}
arr.sortOn("y", "x");
trace('after');
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}


выводит:

x : 1 | y : 10
x : 2 | y : 30
x : 5 | y : 10
x : 3 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 7 | y : 20
x : 4 | y : 20
after
x : 1 | y : 10
x : 3 | y : 10
x : 5 | y : 10
x : 4 | y : 20
x : 7 | y : 20
x : 2 | y : 20
x : 3 | y : 20
x : 2 | y : 30

Jlekc
11.12.2003, 18:58
а меня:
x : 1 | y : 10
x : 2 | y : 30
x : 5 | y : 10
x : 3 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 7 | y : 20
x : 4 | y : 20
after
x : 3 | y : 10
x : 5 | y : 10
x : 1 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 7 | y : 20
x : 4 | y : 20
x : 2 | y : 30

посмотри синтаксис функции sortOn. В хелпаке всегда есть рабочий пример.
Или достать нормальный флеш ( у всех работает ) :p

: hr :
11.12.2003, 19:15
а мне то нужно

after

x : 1 | y : 10
x : 3 | y : 10
x : 5 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 4 | y : 20
x : 7 | y : 20
x : 2 | y : 30

:confused:

: hr :
11.12.2003, 20:53
Ребята, выручайте... :o

Что делать то? Может кто иной способ сортировки предложит? Другой Flash сейчас возможности нет достать.

:rolleyes:

Usnul
11.12.2003, 23:40
пишу, скоро будет :)

iLoveYou
11.12.2003, 23:45
: hr :, предложенный мной алгоритм работает, только он не учитывает, как выясняется, все твои требования. подумаю -- переделаю. а ты тоже без дела не сиди -- поищи в инете алгоритмы сортировки двумерных массивов.

: hr :
12.12.2003, 00:05
OK!!! ;)

Спасибо!!! :)

iLoveYou
12.12.2003, 00:16
arr = [];
arr.push({x:1, y:8});
arr.push({x:1, y:6});
arr.push({x:9, y:8});
arr.push({x:2, y:9});
arr.push({x:5, y:2});
arr.push({x:5, y:6});
arr.push({x:8, y:6});
arr.push({x:4, y:1});
arr.push({x:6, y:2});
arr_len = arr.length;
function sortarr(par1, par2) {
for (var i = 0; i<arr_len; i++) {
for (var k = i+1; k<arr_len; k++) {
if (arr[i][par1]>arr[k][par1]) {
sx = arr[i].x;
sy = arr[i].y;
arr[i].x = arr[k].x;
arr[i].y = arr[k].y;
arr[k].x = sx;
arr[k].y = sy;
} else if (arr[i][par1] == arr[k][par1]) {
if (arr[i][par2]>arr[k][par2]) {
sxy = arr[i][par2];
arr[i][par2] = arr[k][par2];
arr[k][par2] = sxy;
}
}
}
}
}
function printarr() {
for (var i = 0; i<9; i++) {
trace("x : "+arr[i].x+" | "+"y : "+arr[i].y);
}
}
printarr();
trace("=======");
sortarr("x", "y");
printarr();
trace("=======");
sortarr("y", "x");
printarr();

Usnul
12.12.2003, 00:46
trace("Origin");
trace("===========================");
arr = [];
arr2=[];
arr[0] = {x:1, y:10};
arr[1] = {x:2, y:30};
arr[2] = {x:5, y:10};
arr[3] = {x:3, y:10};
arr[4] = {x:2, y:20};
arr[5] = {x:3, y:20};
arr[6] = {x:7, y:20};
arr[7] = {x:4, y:20};
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}
trace("sortOn");
trace("===========================");
arr.sortOn("y");
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}
for(var i=0;i<arr.length;i++){
if(typeof(arr2[arr[i].y])!="object"){arr2[arr[i].y]=[]}
arr2[arr[i].y][arr[i].x]=arr[i].x
}
for(var i=0;i<arr2.length;i++){
if(typeof(arr2[i])=="object"){
for(var j=0;j<arr2[i].length;j++){
if(typeof(arr2[i][j])=="number"){
if(a==undefined){a=0}
arr[a]={x:j,y:i}
a++
}
}
}
}
trace('after');
trace("===========================");
for (var i = 0; i<arr.length; i++) {
trace('x : '+arr[i].x+' | '+'y : '+arr[i].y);
}

//Всем горе программерам посвящается :)
//Только парня запутали :)

Usnul
12.12.2003, 00:47
Origin
===========================
x : 1 | y : 10
x : 2 | y : 30
x : 5 | y : 10
x : 3 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 7 | y : 20
x : 4 | y : 20
sortOn
===========================
x : 3 | y : 10
x : 5 | y : 10
x : 1 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 7 | y : 20
x : 4 | y : 20
x : 2 | y : 30
after
===========================
x : 1 | y : 10
x : 3 | y : 10
x : 5 | y : 10
x : 2 | y : 20
x : 3 | y : 20
x : 4 | y : 20
x : 7 | y : 20
x : 2 | y : 30

Usnul
12.12.2003, 00:54
Серег, я первый взялся писать, так что это вроде как наезд :confused:
смысл тот же, но я пол часа спустил при написании кода, гони мои пол часа обратно :)


ЗЫ
Не люблю! Не люблю! Не люблю! Не люблю! Не люблю! Не люблю! Не люблю! Не люблю! Не люблю! Не люблю!

Nox Noctis
12.12.2003, 01:18
кхм... я канеш не настолько немеряно крут, чтобы написать три десятка строк за пол часа... и сортировку я не люблю... я люблю луну и спать...

но объясните мне, вот такого кода не достаточно для решения задачи ? :)
arr = [{x: ... , y: ...}, ..... ];
sortXY = function (a, b) {
return (a.y == b.y)*(a.x>b.x || -1) || (a.y>b.y || -1);
};
arr.sortOn("y");
arr.sort(sortXY);

зы: голову ! берегите голову !

Mage Lord
12.12.2003, 01:56
Спакуха, Нокс. Нифига ты не понимаешь в колбасных обрезках. Нормальные герои всегда идут в обход. ;)

Jlekc
12.12.2003, 12:02
Если делать то универсально :D . Сортировка с любым количеством аргументов:


Array.prototype.mySortOn = function() {
this.constructor.arg = arguments;
// проблема с аргументами проверю потом
// ----- begin Compare
function compare() {
var argPrev = arguments[1].constructor.argPrev;
arguments[1].constructor.argPrev = arguments[0];
if (argPrev == undefined) {
arguments[1].sortOn(arguments[0]);
} else {
var i = 0;
var _arr = [arguments[1][0]];
var _sort = [];
while (i<arguments[1].length) {
if (arguments[1][i][argPrev] == arguments[1][i+1][argPrev]) {
_arr.push(arguments[1][i+1]);
} else {
_arr.sortOn(arguments[0]);
_sort = _sort.concat(_arr);
delete _arr;
_arr = [arguments[1][i+1]];
}
++i;
}
return _sort;
}
return arguments[1];
}
// ----- end of Compare
while (this.constructor.arg.length>0) {
this = compare(this.constructor.arg.shift(), this);
}
// ????????????????? this уже не принадлежит к arr
arr = this;
};
// ------- end Of Function
arr = [];
arr.push({x:1, y:1, z:1});
arr.push({x:2, y:2, z:2});
arr.push({x:2, y:2, z:1});
arr.push({x:2, y:1, z:1});
arr.push({x:3, y:1, z:1});
arr.push({x:2, y:1, z:2});
arr.mySortOn("y", "x", "z");
//
for (var i = 0; i<arr.length; i++) {
trace("x : "+arr[i].x+" | "+"y : "+arr[i].y+" | "+"z : "+arr[i].z);
}


Только народ возник глюк :confused: . Объект и его псевдоним раздилились, пришлось писать какойто бред см. строку 34. Может кто чо понимает??

iLoveYou
12.12.2003, 12:12
Оригинал написал(а) Nox Noctis
но объясните мне, вот такого кода не достаточно для решения задачи ? :)
голову ! берегите голову !
Нокс, я тебя уважаю :)
Но когда я смотрю на предложенное тобой решение, вспоминаю времена, когда вы с BlooDeliMiter'ом и другими умными людьми соревновались на предмет "кто напишет один и тот же по смыслу код короче". Мне кажется, что здесь это не нужно, так как человеку требуется не решение как таковое, а освоение принципа. тогда он не скажет через неделю:"Нокс, а переделай свой код для меня так, чтобы он еще..........., короче, кофе в постель приносил" :) Ведь, согласись, твое решение не всем понятно и очевидно, хотя красиво и кратко. А показанный мной алгоритм до такой степени прост и прозрачен, что, может быть, лучше не жертвовать строками кода ради краткости. Мне кажется, понимание важнее. :)

Nox Noctis
12.12.2003, 19:01
Оригинал написал(а) Sergey"iLoveYou"
Нокс, я тебя уважаю :) так мы с вами уважаемые люди ! :)))

в ифах слишком много строк :) но в любом случае - я сильно удивился тому как вы хитрецки стали решать эту сортировку...
_________________________________

есть два свойства - Y и X, нужно отсортировать по обоим, причем приоритет у Y...

первая сортировка делается через Array.sortOn - это сделали все. а вторая - делается через Array.sort с нестандартной функцией сортировки.. это не очевидно ? вопрос только в том как правильно эту функцию сформулировать...

2: hr :
функция сортировки получает два элемента массива A и B и выдает
1 : если A нужно поставить перед B
-1 : если А нужно поставить после В
0 : если менять местами А и В не нужно

учитывая что у нас в массиве объекты, и что сортировку по Y нарушать нельзя, получается следующее:

сортировка(А, В) {
1. если А.Y не равно B.Y => по X сортировать нельзя,
надо руководствоваться значениями Y.
возвращаем 1 если А.Y>B.Y, -1 если А.Y<B.Y и 0 если они равны.

2. если А.Y равно B.Y => по X сортировать можно.
возвращаем 1 если А.X>B.X, -1 если А.X<B.X
}

iLoveYou
13.12.2003, 00:42
Оригинал написал(а) Nox Noctis

в ифах слишком много строк :) но в любом случае - я сильно удивился тому как вы хитрецки стали решать эту сортировку...
[/CODE]
чего ж там такого хитрецкого? :)
простейший "пузырьковый" алгоритм сортировки, знакомый всем с глубокого детства.
кстати, вот вопрос: встроенные sort() и sortOn() по какому алгоритму осуществлены? сомневаюсь, что по продвинутому, вроде хоаровского. или на встроенные методы ограничения плеера не действуют? ;) по крайней мере, мои опыты в осуществлении алгоритмов сортировки во флеше спотыкаются о суровое правило 256 рекурсий :)
бррр! это я к тому, что если встроенные методы основаны на простых алгоритмах сортировки, то твоя сортировка займет в 1.5-2 раза больше времени, чем моя, из-за того, что проход по элементам осуществляется дважды.

Nox Noctis
13.12.2003, 00:53
не занудствуй :)

ты и сам прекрасно понимаешь,
что соотношение овчинки и выделки всегда должно быть в пользу овчинки.. :) если вопсользоваться Array.sort - написание сортировки занимает от трех до десяти минут при сильном ветре...

поэтому не о чем тут спорить мне кажется :)

iLoveYou
13.12.2003, 12:20
мы разве спорим? :) У нас просто несколько разные подходы.
да, я въедливый. а ты, а ты ... короче, сам знаешь. :)
единственный вопрос:
встроенные sort() и sortOn() по какому алгоритму осуществлены?

: hr :
16.12.2003, 14:35
Ребята, всем огромное спасибо!!! :cool: Обещанную награду в виде пива, предлагаю получить лично, в Питере, или... бандеролью!!! :D :D

Nox Noctis
16.12.2003, 14:41
Оригинал написал(а) : hr :
предлагаю получить лично, в Питеревот это ты зря сказал :)))

nuran
17.12.2003, 09:47
Оригинал написал(а) Mage Lord
Спакуха, Нокс. Нифига ты не понимаешь в колбасных обрезках. Нормальные герои всегда идут в обход. ;)
ааа... твоего друга не Бармолеем кличут ? :):):)

iLoveYou
17.12.2003, 18:54
Оригинал написал(а) Nox Noctis
вот это ты зря сказал :)))
неа, зря он сказал вот это:
или... бандеролью!!!
:)