PDA

Просмотр полной версии : Как создать зависимость между массивами?


AlliAS
11.11.2007, 15:59
Привет, это опять я.
На этот раз у меня такая трабла:
я хочу узнать как создать зависимость между массивами. Ну а если попроще, то смотрите:
есть у меня код, в котором 2 массива: первый содержит русские слова, второй - их английский перевод
как видно из кода, оба массива сортируються, но после сортировки индексы русских слов не соответствуют индексам английских.
var oneArray:Array = new Array("круг","квадрат","круто","красный","зеленый")
var twoArray:Array = new Array("circle","square","cool","red","green")
oneArray.sort();
twoArray.sort();
trace(oneArray)
trace(twoArray)
//зеленый,квадрат,красный,круг,круто
//circle,cool,green,red,square
//а нужно:
//зеленый,квадрат,красный,круг,круто
//green,square,red,circle,cool
Как сделать так, чтобы индексы элементов второго массива менялись согласно первому?

DarkLight
11.11.2007, 16:09
сведите в один массив объектов с полями, и используйте sortOn

olexandr
11.11.2007, 16:10
как вариант, хранить переводы слов в виде свойств соответствующих элементов русского массива.

или делать второе поле для своеобразного ID и после сортировки русского массива, расставлять английский в этом же порядке.

2morrowMan
11.11.2007, 16:43
var oneArray:Array = new Array("круг","квадрат","круто","красный","зеленый");
var twoArray:Array = new Array("circle","square","cool","red","green");
var thirdArray:Array = [];
for (var i:int = 0; i < oneArray.length; i++)
{
thirdArray[oneArray[i]] = twoArray[i];
}
oneArray.sort();
for each(var word:String in oneArray)
{
trace(word + ' - ' + thirdArray[word]);
}

Для подобного есть и еще можно придумать не один способ ;)

iNils
11.11.2007, 16:45
2morrowMan, это раздел не по AS3, поэтому правте код.
Который к тому же с ошибкой.

wvxvw
11.11.2007, 19:17
var a_arr:Array = ["zo","za","zaa","ya","Zia"];
var b_arr:Array = ["1","2","3","4","5"];
var foo_arr:Array = [];
//
a_arr.sort(sortABC);
b_arr.sort(sortPattern);
trace(a_arr);
trace(b_arr);
function sortABC(a,b):Number {
var _a:Number = a.toLowerCase().charCodeAt(0);
var _b:Number = b.toLowerCase().charCodeAt(0);
var i:Number = 0;
while(_a==_b){

i++;
var _a:Number = a.toLowerCase().charCodeAt(i);
var _b:Number = b.toLowerCase().charCodeAt(i);
if(i>=a.length){
foo_arr.push(0);
return 0;
}
}
if(_a<_b){
foo_arr.push(-1);
return -1;
} else {
foo_arr.push(1);
return 1;
}
}
function sortPattern():Number {
return isNaN(foo_arr[0]/1)? 0 : foo_arr.shift();
}
Ну, это общая задумка, нужно еще подумать, как бы оптимизировать.

upd:
Array.prototype.multySort = function(f:Function):Void {
var i:Number = 0;
while(i<this.length){
if(f(this[i],this[i+1])==-1){
var _a = this[i];
var _b = this[i+1];
this[i] = _b;
this[i+1] = _a;
var al:Number = arguments.length;
while(al>1){
var _a = arguments[al-1][i];
var _b = arguments[al-1][i+1];
arguments[al-1][i] = _b;
arguments[al-1][i+1] = _a;
al--;
}
i--;
} else {
i++;
}
}
this.reverse();
var al:Number = arguments.length;
while(al>1){
arguments[al-1].reverse();
al--;
}
}
//
var a_arr:Array = ["zo","za","под","ya","Zia"];
var b_arr:Array = ["1","2","3","4","5"];
//
a_arr.multySort(sortABC,b_arr);
//
trace(a_arr);
trace(b_arr);
function sortABC(a,b):Number {
var _a:Number = a.toLowerCase().charCodeAt(0);
var _b:Number = b.toLowerCase().charCodeAt(0);
var i:Number = 0;
while(_a==_b){

i++;
var _a:Number = a.toLowerCase().charCodeAt(i);
var _b:Number = b.toLowerCase().charCodeAt(i);
if(i>=a.length){
return 0;
}
}
if(_a<_b){
return -1;
} else {
return 1;
}
}Ну, я знаю, что не стоит работать с прототипами, но, на мой взглайд, может быть полезная утилита =)

AlliAS
11.11.2007, 22:50
Ого какой здоровенный код на такую простую функцию. Что неужели нету спец методов сортировки одного массива на основании другого?

Но все равно большое спасибо