Strict Standards: Resource ID#18 used as offset, casting to integer (18) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#23 used as offset, casting to integer (23) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#25 used as offset, casting to integer (25) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#26 used as offset, casting to integer (26) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: функции сортировки для метода sort()
ТвойWeb ТвойWeb
Качественный Европейский хостинг
Форум для чайников
 Чат на форуме      Помощь      Поиск      Пользователи


 Страниц (2): [1] 2 » 

> Без описания
Самоделкин
Отправлено: 10 Мая, 2008 - 14:23:51
Post Id



Junior Member


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2005  

Карма 1




Есть две вспомогательных функции для сортировки текстовых массивов (для аргумента метода sort()).
Одна - для сортировки без учёта регистра:

CODE:
function anyCase (x,y)
{
if (x.toLowerCase()<y.toLowerCase())
{return -1;}
if (x.toLowerCase()>y.toLowerCase())
{return 1;}
return 0;
}


Другая - для учёта буквы Ё (только по первым буквам):

CODE:
function yoMoyo(x, y) {
if (x.charCodeAt(0)>=1025) // "Ё"
{
if (x.charCodeAt(0)<=1071) // большие буквы
{ if (x.charCodeAt(0)<=1045 && y.charCodeAt(0)==1025)
{return -1;}
else
{if (x.charCodeAt(0)==1025 && y.charCodeAt(0)<=1045)
{return 1;}
else
{return 0;}
}
}
else
{if (x.charCodeAt(0)>=1072) // маленькие буквы
{if (x.charCodeAt(0)>=1078 && y.charCodeAt(0)==1105)
{return 1;}
else
{if (x.charCodeAt(0)==1105 && y.charCodeAt(0)>=1078)
{return -1;}
else
{return 0;}
}
}
}
}
return 0;
}


Сами по себе обе работают.
1. Не получается совместить их
2. Непонятно, как сортировать в строгом алф. порядке: for (i in ГДЕ?) Метод sort() ведь аргументов функции не принимает.
 
 Top
Самоделкин
Отправлено: 10 Мая, 2008 - 19:35:59
Post Id



Junior Member


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2005  

Карма 1




Совмещение получается, но каким-то "левым" способом:
CODE:
function reSort(n) {
var m = n.sort(anyCase);
return m.sort(yoMoyo);
}

И саму функцию Ё немного оптимизировал:
CODE:
function yoMoyo(x, y) {
var anyX = x.toLowerCase();
var anyY = y.toLowerCase();
if (anyX.charCodeAt(0)>=1072)
{if (anyX.charCodeAt(0)>=1078 && anyY.charCodeAt(0)==1105)
return 1;
if (anyX.charCodeAt(0)==1105 && anyY.charCodeAt(0)>=1078)
return -1;
}
return 0;
}

Вопрос по строгому алфавитному порядку остаётся открытым.

(Отредактировано автором: 10 Мая, 2008 - 20:07:10)

 
 Top
Furax
Отправлено: 10 Мая, 2008 - 22:50:18
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




CODE:
function caseUnsensitiveSort(x, y)
{
x = x.toLowerCase();
y = y.toLowerCase();

if (x==y)
return 0;

x=x.split('');
y=y.split('');

var i;

for (i =0; i<x.length; ++i)
if (x[i] == 'ё')
x[i] = 'е'.charCodeAt(0)+0.5;
else
x[i] = x[i].charCodeAt(0);

for (i =0; i<y.length; ++i)
if (y[i] == 'ё')
y[i] = 'е'.charCodeAt(0)+0.5;
else
y[i] = y[i].charCodeAt(0);

var length = Math.min(x.length, y.length);

for (var i=0; i<length; ++i)
if (x[i] != y[i])
return x[i]-y[i];

if (x.length > y.length)
return 1;
else
return -1;
}

a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Вас"];

a.sort(caseUnsensitiveSort);


Это, что называется, "в лоб", без оптимизаций.

(Отредактировано автором: 10 Мая, 2008 - 22:53:15)

 
 Top
Самоделкин
Отправлено: 10 Мая, 2008 - 23:24:38
Post Id



Junior Member


Покинул форум
Сообщений всего: 59
Дата рег-ции: Нояб. 2005  

Карма 1




Furax
В Мозилле и Опере работает, в IE выдаёт undefined.
Цепляется к строке
CODE:
x=x.split('');

А лично мне пока непонятно, что такое 0.5
CODE:
x[i] = 'е'.charCodeAt(0)+0.5;


Ага, понял. Остроумно. Но почему в "Осле" тормозит, не разобрался.

(Отредактировано автором: 10 Мая, 2008 - 23:41:08)

 
 Top
Furax
Отправлено: 10 Мая, 2008 - 23:45:46
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




Тогда так:
CODE:
function caseUnsensitiveSort(x, y)
{
x = x.toLowerCase();
y = y.toLowerCase();

if (x==y)
return 0;

var xCodes = [];
var yCodes = [];

var i;

for (i=0; i<x.length; ++i)
if (x.charAt(i) == 'ё')
xCodes[i] = 'е'.charCodeAt(0)+0.5;
else
xCodes[i] = x.charCodeAt(i);

for (i=0; i<y.length; ++i)
if (y.charAt(i) == 'ё')
yCodes[i] = 'е'.charCodeAt(0)+0.5;
else
yCodes[i] = y.charCodeAt(i);

var length = Math.min(x.length, y.length);

for (var i=0; i<length; ++i)
if (xCodes[i] != yCodes[i])
return xCodes[i]-yCodes[i];

if (x.length > y.length)
return 1;
else
return -1;
}

a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Вас"];

document.write(a.sort(caseUnsensitiveSort).join(', '));
Хотя лично я не понимаю, чем этот вариант лучше, но Ишаку виднее.

Что такое +0.5? Просто коды букв задаются целыми числами, а "ё" стоит на отшибе. Вот я её и впихнул на место. Целое между двух целых не впихнёшь, вот я дробь и вставил.
 
 Top
ETC Администратор
Отправлено: 11 Мая, 2008 - 05:01:45
Post Id



Flash-coder


Покинул форум
Сообщений всего: 5275
Дата рег-ции: Дек. 2003  
Откуда: TimeZero

Карма 26




CODE:
a = ["Вася", "Васёк", "ВасИлий", "ВасЕк", "Вас"];
a = a.join('::').replace('ё','%b%').replace('е','%a%').replace('Ё','%bB%').replace('Е','%A%').split('::');
a.sort(Array.CASEINSENSITIVE);
a = a.join('::').replace('%A%','Е').replace('%a%','е').replace('%B%','Ё').replace('%b%','ё').split('::');
document.write(a.join(', ')+'<br>');
 
 Top
Furax
Отправлено: 11 Мая, 2008 - 05:11:51
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




ETC
JavaScript не знает объекта Array.CASEINSENSITIVE.
 
 Top
ETC Администратор
Отправлено: 11 Мая, 2008 - 05:14:00
Post Id



Flash-coder


Покинул форум
Сообщений всего: 5275
Дата рег-ции: Дек. 2003  
Откуда: TimeZero

Карма 26




А, ну тогда просто sort(), не суть важно.
 
 Top
Furax
Отправлено: 11 Мая, 2008 - 05:54:48
Post Id



Бледнотик


Покинул форум
Сообщений всего: 1472
Дата рег-ции: Март 2007  
Откуда: Иркутск, Сибирь, СССР

Карма 32




ETC
В Твоём коде '%' при сортировке воспринимается интерпритатором как спецсимвол? Ссылочку не дашь?
 
 Top
ETC Администратор
Отправлено: 11 Мая, 2008 - 06:02:12
Post Id



Flash-coder


Покинул форум
Сообщений всего: 5275
Дата рег-ции: Дек. 2003  
Откуда: TimeZero

Карма 26




Никак не воспринимается, можно проценты фигурными скобками заменить, это особого значения не имеет.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 1 (гостей: 1, зарегистрированных: 0, скрытых: 0)
« JavaScript »


Все гости форума могут просматривать этот раздел.
Только администраторы и модераторы могут создавать новые темы в этом разделе.
Только администраторы и модераторы могут отвечать на сообщения в этом разделе.



Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0438]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33