24.09.2013, 11:00
|
Новичок на форуме
|
|
Регистрация: 24.09.2013
Сообщений: 4
|
|
Не выполняется условие в IF
Доброе утро, камрады...
Я озадачен.
Возможно здорово туплю, но глаз уже замылился и ничего не понимаю.
Банальная пузырьковая сортировка. Проще некуда.
Сортирую массив по одной из колонок. Сортируется где-то наполовину, потом перестает.
Смотрю в Firebug пошагово и не верю глазам
С=14, arr[i+1][2]=16 и условие не выполняется (блок пропускается).
При этом несколько проходов уже было успешно сделано на том же массиве данных.
if ( С < arr[i+1][2] )
{
arr[i][0] = arr[i+1][0];
arr[i][1] = arr[i+1][1];
arr[i][2] = arr[i+1][2];
arr[i+1][0] = A;
arr[i+1][1] = B;
arr[i+1][2] = C;
change_flag = 1;
}
Помогите плиз лыжи стронуть с места... не едут...
|
|
25.09.2013, 14:18
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,232
|
|
Сообщение от Papazol
|
С=14, arr[i+1][2]=16 и условие не выполняется (блок пропускается).
|
Т.е. нам верить тебе на слово?
Конечно IF сломался - фигли!
Тут у других не только IFы ломались... В JS вообще мало чего работает...
|
|
25.09.2013, 15:22
|
Новичок на форуме
|
|
Регистрация: 24.09.2013
Сообщений: 4
|
|
Сообщение от ksa
|
Т.е. нам верить тебе на слово?
Конечно IF сломался - фигли!
Тут у других не только IFы ломались... В JS вообще мало чего работает...
|
А причем здесь "верить-не верить"? Я же ничего тут не продаю и в секту не заманиваю.
По существу-то есть что-нибудь сказать?
IFы, кстати, "ломаются" не так и редко в JS, по сравнению с Си, например.
Вот, например.
Но мне приведение значений parseInt-ом не помогло.
"use strict" тоже не помог (хотел избавиться от возможных глюков с восьмеричным представлением числа в массиве данных).
Кто-нибудь сталкивался с таким случаем? Куда копать?
(гуглёж пока ничего особенного не принёс)
|
|
25.09.2013, 15:30
|
Аспирант
|
|
Регистрация: 01.04.2008
Сообщений: 52
|
|
Сообщение от Papazol
|
А причем здесь "верить-не верить"? Я же ничего тут не продаю и в секту не заманиваю.
По существу-то есть что-нибудь сказать?
IFы, кстати, "ломаются" не так и редко в JS, по сравнению с Си, например.
Вот, например.
Но мне приведение значений parseInt-ом не помогло.
"use strict" тоже не помог (хотел избавиться от возможных глюков с восьмеричным представлением числа в массиве данных).
Кто-нибудь сталкивался с таким случаем? Куда копать?
(гуглёж пока ничего особенного не принёс)
|
Для начала покажите весь код, а не кусок с if. Да и вообще интересно, в массиве точно цифры.
|
|
25.09.2013, 15:53
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,232
|
|
Сообщение от Papazol
|
IFы, кстати, "ломаются" не так и редко в JS, по сравнению с Си, например.
Вот, например.
|
Ужоснах!
Как теперь писать - х/з...
|
|
25.09.2013, 15:54
|
|
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,232
|
|
Сообщение от Papazol
|
Куда копать?
|
Тестовый пример нужно делать полный. И это для начала...
|
|
25.09.2013, 17:46
|
Новичок на форуме
|
|
Регистрация: 24.09.2013
Сообщений: 4
|
|
Сообщение от vashurin
|
Для начала покажите весь код, а не кусок с if. Да и вообще интересно, в массиве точно цифры.
|
Получаю массив пар кодов примерно такой
(на самом деле их тысячи)
var source =
[
[743,434],
[743,968],
[310,968],
[262,434],
[695,677],
[695,274],
[145,274],
[695,174],
[743,871],
[145,532],
[922,677],
[485,677],
[821,729],
[743,336],
[111,274],
[588,729],
[743,274],
[695,968],
[695,677],
[821,174],
[111,871],
[821,871],
[145,968],
[922,968],
[588,729],
[111,532]
]
Нужно подсчитать, какие пары встречаются часто, какие реже - частотность, короче. Ну я и считаю эту частотность (что получается), а потом пытаюсь ее сортировать (что не получается)
На самом деле в массиве могут быть некачественные данные,
поэтому я привожу их в int
function freqPairs( source )
{
var pairs_matched = new Array();
var pairsmatched_n=0;
var pairs = new Array();
var pairs_n=0;
var tmp_pairs_freq = [-1,-1,-1];
var tmp_pair = [-1,-1];
// насильно конвертим source в десятичный инт
for (var b=0; b < source.length; b++)
{
tmp_pair[0] = parseInt(source[b][0],10);
tmp_pair[1] = parseInt(source[b][1],10);
pairs_n = pairs.push( tmp_pair );
tmp_pair = [-1,-1];
}
// подсчитываем частотность пар
var cnt2=0;
var pair_flag=1;
tmp_pairs_freq[0] = pairs[0][0];
tmp_pairs_freq[1] = pairs[0][1];
tmp_pairs_freq[2] = parseInt(1,10);
pairsmatched_n = pairs_matched.push( tmp_pairs_freq );
for (G=1; G < pairs.length; G++)
{
tmp_pairs_freq = [-1,-1,-1];
pair_flag=1;
for (F=0; F < pairs_matched.length; F++)
{
if ( pairs[G][0] === pairs_matched[F][0] )
{
if ( pairs[G][1] === pairs_matched[F][1] )
{
pair_flag=0;
cnt2=pairs_matched[F][2];
cnt2++;
pairs_matched[F][2]=cnt2;
}
}
}
if ( pair_flag )
{
tmp_pairs_freq[0] = pairs[G][0];
tmp_pairs_freq[1] = pairs[G][1];
tmp_pairs_freq[2] = parseInt(1,10);
pairsmatched_n = pairs_matched.push( tmp_pairs_freq );
}
}
// сортируем пары по частотности
var A = 0;
var B = 0;
var С = 0;
var change_flag = 1;
while ( change_flag > 0 )
{
A = pairs_matched[0][0];
B = pairs_matched[0][1];
С = pairs_matched[0][2];
change_flag = 0;
for (var S=0; S < pairs_matched.length-1; S++)
{
A = pairs_matched[S][0];
B = pairs_matched[S][1];
C = pairs_matched[S][2];
//вот тут периодически не срабатывает
if ( С < pairs_matched[S+1][2] )
{
pairs_matched[S][0] = pairs_matched[S+1][0];
pairs_matched[S][1] = pairs_matched[S+1][1];
pairs_matched[S][2] = pairs_matched[S+1][2];
pairs_matched[S+1][0] = A;
pairs_matched[S+1][1] = B;
pairs_matched[S+1][2] = C;
change_flag = 1;
}
}
}
}
|
|
25.09.2013, 18:42
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,133
|
|
Papazol,
var source =
[
[743,434],
[743,968],
[310,968],
[262,434],
[695,677],
[695,274],
[145,274],
[695,174],
[743,871],
[145,532],
[922,677],
[485,677],
[821,729],
[743,336],
[111,274],
[588,729],
[743,274],
[695,968],
[695,677],
[821,174],
[111,871],
[821,871],
[145,968],
[922,968],
[588,729],
[111,532]
]
function freqPairs(b) {
for (var c = {}, a = 0; a < b.length; a++) {
var d = b[a];
c[d] ? c[d]++ : c[d] = 1
}
b.sort(function (a, b) {
return c[b] - c[a] || b[0] - a[0] || b[1] - a[1]
});
for (a = 0; a < b.length; a++) b[a][2] = c[b[a]];
return b
};
alert(freqPairs( source ).join('\n'));
|
|
26.09.2013, 13:55
|
Новичок на форуме
|
|
Регистрация: 24.09.2013
Сообщений: 4
|
|
Сообщение от рони
|
Papazol,
function freqPairs(b) {
for (var c = {}, a = 0; a < b.length; a++) {
var d = b[a];
c[d] ? c[d]++ : c[d] = 1
}
b.sort(function (a, b) {
return c[b] - c[a] || b[0] - a[0] || b[1] - a[1]
});
for (a = 0; a < b.length; a++) b[a][2] = c[b[a]];
return b
};
alert(freqPairs( source ).join('\n'));
|
Спасибо за код!
Код рабочий - в смысле, что он выполняется и ничего не ломается.
Правда он все равно не отсортировал, как надо, но его наверняка можно доточить.
На самом деле я зарешал проблему самостоятельно. Применил другой алгоритм - шейкерную сортировку. Это конечно просто улучшение того же "пузырька", но мне вдруг помогло.
То, что проблему решил - это хорошо...
А вот то, что так и не понял, шоэтобыло - это плохо...
|
|
26.09.2013, 14:15
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,133
|
|
Сообщение от Papazol
|
Правда он все равно не отсортировал
|
и каков же результат сортировки должен быть?
|
|
|
|