02.10.2011, 23:29
|
Аспирант
|
|
Регистрация: 29.09.2011
Сообщений: 42
|
|
расставить в порядке убывания
есть два массива:
ss1=[18,74,6,9,32,1];
ss2=["width","none","color","border","after","div"];
число первого означает, сколько раз использовано слово из второго массива в тексте. Например ss2[3] повторяется ss1[3] раз, тоесть шесть.
Мне нужно расставить эоементы второго массива так, чтобы на первом месте стояли самые употребляемые слова, тоесть получился такой массив:
ss3=["none","after","width","border","color","div"];
никак не получается сформулировать код, помогите, хотя бы словами подскажите.
|
|
03.10.2011, 00:32
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
var ss1=[18,74,6,9,32,1],
ss2=["width","none","color","border","after","div"];
alert( getSorted(ss1, ss2) );
function getSorted(array1, array2){
return sort( array1.slice(), array2.slice(), [] );
function sort(array1, array2, result){
if( array1.length == 0 ) return result;
var index = array1.indexOf( Math.max.apply( Math, array1 ) );
array1.splice( index, 1 );
result.push( array2.splice( index, 1 ) );
return sort(array1, array2, result);
};
};
|
|
03.10.2011, 21:54
|
|
Аспирант
|
|
Регистрация: 06.04.2010
Сообщений: 90
|
|
var tmp = {};
for(var i = 0; i < ss1.length; i++) tmp[ss1[i]] = ss2[i];
ss1.sort();
ss3 = [];
for(var i = 0; i < ss1.length; i++) ss3.push(tmp[ss1[i]]);
delete(tmp);
|
|
04.10.2011, 09:17
|
Аспирант
|
|
Регистрация: 29.09.2011
Сообщений: 42
|
|
aiky,
а если в первом массиве есть одинаковые значения?
|
|
04.10.2011, 10:40
|
|
Аспирант
|
|
Регистрация: 06.04.2010
Сообщений: 90
|
|
qwertyuiop10,
По факту - их нет.
Согласен что вполне могут быть, выход "навскидку" - значения временного хэша помещать в массив:
var tmp = {};
for(var i = 0; i < ss1.length; i++){
if(!tmp[ss1[i]]) tmp[ss1[i]] = [];
tmp[ss1[i]].push(ss2[i]);
}
ss1.sort();
ss3 = [];
for(var i = 0; i < ss1.length; i++)
for(var j = 0; j < tmp[ss1[i]].length; j++) ss3.push(tmp[ss1[i]][j]);
delete(tmp);
Я предложил принцип, понятно, что для простейшего случая.
Кстати, если есть одинаковые значения - в каком порядке их размещать в массиве(ss3)? ..в порядке следования ,по алфавиту или еще как? ..это к тому что неявно
Последний раз редактировалось aiky, 04.10.2011 в 11:15.
|
|
04.10.2011, 10:51
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,205
|
|
Сообщение от qwertyuiop10
|
нужно расставить эоементы второго массива так, чтобы на первом месте стояли самые употребляемые слова
|
Предложу такой вариант...
<!DOCTYPE html>
<html>
<head>
<!--
<script src="http://code.jquery.com/jquery-latest.js"></script>
-->
<style type="text/css">
</style>
<script type="text/javascript">
function Go() {
var a1=[18,74,6,9,32,1];
var a2=["width","none","color","border","after","div"];
var a=[],o,i
for (i=0; i<a1.length; i++) {
o={
N: a1[i],
Str: a2[i]
}
a[i]=o
}
a.sort(function (A,B) {return B.N-A.N}
)
for (i=0; i<a1.length; i++) {
alert(a[i].N+'='+a[i].Str)
}
}
</script>
</head>
<body onload='Go()'>
</body>
</html>
|
|
04.10.2011, 11:10
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
А чем мой вариант плох?
|
|
04.10.2011, 11:32
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,205
|
|
Sweet, я не оцениваю как плох/хорош... Просто еще один вариант. А там пусть берут любой.
|
|
04.10.2011, 11:54
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,105
|
|
Ещё вариант...
var ss1=[18,74,6,9,32,1];
var ss2=["width","none","color","border","after","div"];
var s = [];
ss1.sort(function(a,b){var a = b-a;s.push(a); return a})
ss2.sort(function(){return s.shift()})
alert(ss2);
|
|
04.10.2011, 12:21
|
Профессор
|
|
Регистрация: 29.06.2011
Сообщений: 445
|
|
рони, лаконично, жаль только что сортировка делается дважды. Мой вариант:
var ss1 = [18, 74, 6, 9, 32, 1],
ss2 = ["width", "none", "color", "border", "after", "div"];
function getSorted(keys, values) {
var tmp = {},
i, l = keys.length;
for (i = 0; i < l; i++) {
tmp[values[i]] = keys[i];
}
return values.sort(function(a, b) {
return tmp[b] - tmp[a];
});
}
alert(getSorted(ss1, ss2));
|
|
|
|