PDA

Просмотр полной версии : Своя сортировка...


this.wampa
10.05.2006, 09:24
Подскажите, как при помощи sort или sortOn, сортировать массив по своим правилам, т.е. я хочу чтобы порядок был таким: l, m, h (не по очереди в алфавите). Например:

Несортированный массив: med, low, med, high, low, low, high
А нужно получить: low, low, low, med, med, high, high

iNils
10.05.2006, 13:23
sortRules = function (a, b) {
if (objRules[a]>objRules[b]) {
return 1;
} else if (objRules[a]>objRules[b]) {
return -1;
}
};
objRules = {low:0, med:1, high:2};
arrayStart = ["med", "low", "med", "high", "low", "low", "high"];
arrayStart.sort(sortRules);
trace(arrayStart);

this.wampa
10.05.2006, 13:44
Спасибо iNils!!! То что надо! Я долго парилась над этой задачей... Ты просто чудо!

this.wampa
10.05.2006, 17:58
Рано радовалась...
А как мне еще сделать это для sortOn. т.е. для такого массива:

dataArray.push({id:"1", name:"med"});
dataArray.push({id:"2", name:"med"});
dataArray.push({id:"3", name:"high"});
dataArray.push({id:"4", name:"low"});
dataArray.push({id:"5", name:"med"});
dataArray.push({id:"6", name:"high"});
dataArray.push({id:"7", name:"low"});

Nirth
10.05.2006, 18:06
Array.sortOn(); (http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001201.html#3989254)

this.wampa
10.05.2006, 18:17
Array.sortOn(); (http://novemberain.com/livedocs/Help/ActionScriptLangRef/00001201.html#3989254)
Спасибо, в хелп я умею обращаться. Но в методе sortOn нет compareFunction.

iNils
10.05.2006, 18:21
dataArray = [];
dataArray.push ({id:"1", name:"med"});
dataArray.push ({id:"2", name:"med"});
dataArray.push ({id:"3", name:"high"});
dataArray.push ({id:"4", name:"low"});
dataArray.push ({id:"5", name:"med"});
dataArray.push ({id:"6", name:"high"});
dataArray.push ({id:"7", name:"low"});
sortRules = function (a, b) {
if (objRules[a.name] > objRules[b.name]) {
return 1;
} else if (objRules[a.name] > objRules[b.name]) {
return -1;
}
};
objRules = {low:0, med:1, high:2};
dataArray.sort (sortRules);
for (var i=0; i< dataArray.length; i++) {
trace (dataArray[i].id + " " + dataArray[i].name);
}

this.wampa
10.05.2006, 19:23
Спасибо iNils, твой код чудно работает, но я его впихнула в класс, и он перестал работать:


class as.sortTest {
private var dataArray:Array = new Array();
private var objRules:Object = new Object();

function sortTest() {
objRules = {low:0, med:1, high:2};

dataArray.push ({id:"1", name:"med"});
dataArray.push ({id:"2", name:"med"});
dataArray.push ({id:"3", name:"high"});
dataArray.push ({id:"4", name:"low"});
dataArray.push ({id:"5", name:"med"});
dataArray.push ({id:"6", name:"high"});
dataArray.push ({id:"7", name:"low"});

dataArray.sort (sortRules);
for (var i=0; i< dataArray.length; i++) {
trace (dataArray[i].id + " " + dataArray[i].name);
}
}

private function sortRules(a, b) {
if (objRules[a.name] > objRules[b.name]) {
return 1;
} else if (objRules[a.name] > objRules[b.name]) {
return -1;
}
}
}

iNils
10.05.2006, 19:40
С классами это к Nirth :)

Nirth
10.05.2006, 19:51
1) Классы надо именовать с большой буквы(ошибка не из за этого, но стандарты надо соблюдать)
2)

private var objRules:Object = new Object();

замени на

private var objRules = {low:0, med:1, high:2};

основательно сносим первую строчку из конструктора

Если все еще не работает, скажи какие ошибки выдает, что трейситься и покажи код конструктора класса.

PS Не юзайте вы классы если не понимаете, зачем они нужны =)
PPS При объявлении переменной значение ей можно передавать литералом

private var __str:String = "some string";
private var __array:Array = ["some","array"];
private var __obj:Object = {first:"Some",second:"Object"};

Но пользовать конструктором нельзя

private var __str:String = new String(); //выдаст ошибку

this.wampa
10.05.2006, 20:18
1) Классы надо именовать с большой буквы(ошибка не из за этого, но стандарты надо соблюдать)
2)

private var objRules:Object = new Object();

замени на

private var objRules = {low:0, med:1, high:2};

основательно сносим первую строчку из конструктора

Заменила. Теперь выглядит все так:

class as.sortTest {
private var dataArray:Array = new Array();
private var objRules:Object = {low:0, med:1, high:2};

public function sortTest() {

dataArray.push ({id:"1", name:"med"});
dataArray.push ({id:"2", name:"med"});
dataArray.push ({id:"3", name:"high"});
dataArray.push ({id:"4", name:"low"});
dataArray.push ({id:"5", name:"med"});
dataArray.push ({id:"6", name:"high"});
dataArray.push ({id:"7", name:"low"});

dataArray.sort (sortRules);
for (var i=0; i< dataArray.length; i++) {
trace (dataArray[i].id + " " + dataArray[i].name);
}
}

private function sortRules(a, b) {
if (objRules[a.name] > objRules[b.name]) {
return 1;
} else if (objRules[a.name] > objRules[b.name]) {
return -1;
}
}
}


Если все еще не работает, скажи какие ошибки выдает, что трейситься и покажи код конструктора класса.

Ошибок не выдает, просто не происходит сортировка по выбранному параметру. Трейсит элементы массива в первоначальном порядке. Вызываю класс так:

var MySort:as.sortTest = new as.sortTest();


PS Не юзайте вы классы если не понимаете, зачем они нужны =)

Ну не настолько все запущенно, да и начинать надо с чего-то...

Nirth
10.05.2006, 20:22
Я же написал в PPS что нельзя так делать

private var dataArray:Array = new Array();

делать надо так

private var dataArray:Array

в конструкторе пишем

dataArray=new Array();

Nirth
10.05.2006, 20:38
Стандартная ошибка, не та область видимости.
В слейдующий раз будьте добры протрейсить все переменные, я не всегда такой добрый, чтобы сохранять в папках классы и тестировать.


class ru.flasher.helping.wampa.SortArray {
private var dataArray:Array;
private var objRules:Object = {low:0, med:1, high:2};
public function SortArray() {
dataArray = new Array();
dataArray.push({id:"1", name:"med"});
dataArray.push({id:"2", name:"med"});
dataArray.push({id:"3", name:"high"});
dataArray.push({id:"4", name:"low"});
dataArray.push({id:"5", name:"med"});
dataArray.push({id:"6", name:"high"});
dataArray.push({id:"7", name:"low"});
dataArray.sort(mx.utils.Delegate.create(this,sortRules));
for (var i = 0; i<dataArray.length; i++) {
trace(dataArray[i].id+" "+dataArray[i].name);
}
}
private function sortRules(a:Number, b:Number):Number {
trace(this.objRules.low);
if (objRules[a.name]>objRules[b.name]) {
return 1;
} else if (objRules[a.name]>objRules[b.name]) {
return -1;
}
}
}

я изменил пакет и название класса, с вас изменить обратно.

Бармалей
10.05.2006, 20:41
iNils, compareFunction должна возвращать еще 0 если оба элемента равны:
sortRules = function (a, b) {
if (objRules[a]>objRules[b]) {
return 1;
} else if (objRules[a]>objRules[b]) {
return -1;
}else{
return 0;
}
};

this.wampa
10.05.2006, 20:50
Nirth, спасибо за потраченное время на меня. Все супер-пупер работает, только я вместо Number, Object поставила:

private function sortRules(a:Object, b:Object):Number { ...

Nirth
10.05.2006, 20:53
моя ошибка я уже в посте добавил. извинтиляюсь

iNils
10.05.2006, 21:23
iNils, compareFunction должна возвращать еще 0 если оба элемента равны:
sortRules = function (a, b) {
if (objRules[a]>objRules[b]) {
return 1;
} else if (objRules[a]>objRules[b]) {
return -1;
}else{
return 0;
}
};
В принципе да, но проблемы в том, что "low" поменяется с другим "low" местами я не вижу. Во втором случаи разница конечно будет, так id будут прыгать, но сортировка по id при равных name не указывалась.