Вход

Просмотр полной версии : Array.Sort - проблема с сортировкой русско-английского массива


varvaray
27.07.2009, 19:00
Здравствуйте!
Подскажите, пожайлуста, метод Array.Sort действительно не может отсортировать массив, состоящий из русских и английских слов, перемешанных между собой?
Внизу привожу trace части массива.
И если Array.Sort этого сделать не во состоянии, какие могут быть варианты?


32 massive Subaru type - avto
33 massive Toyota type - avto
34 massive Jeep type - avto
35 massive PUGEOUT type - avto
36 massive PUGEOUT type - avto
37 massive Лаура type - avto
38 massive РРТ type - avto
39 massive Пежо type - avto



32 sorted massive undefined type - avto
33 sorted massive undefined type - avto
34 sorted massive undefined type - avto
35 sorted massive undefined type - avto
36 sorted massive undefined type - avto
37 sorted massive Лаура type - avto
38 sorted massive РРТ type - avto
39 sorted massive Пежо type - avto

Mnilionic
28.07.2009, 14:36
var arr = [ 'Fergie', 'Наташенька', 'Ленок', 'Angelina', 'Анюта', 'Adriana'];
trace(arr);
arr.sort();
trace(arr)

varvaray
29.07.2009, 15:42
Да, спасибо, я читала - но получается, это можно сделать, лишь перебив руками все названия? У меня XML большой, записей на 400. Такой вариант не годится. Причем, после сортировки названий по алфавиту, мне необходимо, чтобы другие массивы, состоящие из записей, соответствующих этим названиям, поменяли порядок в соответствии с сортировкой названий. Т.е. если была запись Jepp, Итальянская, 6, 333-33-33, то после сортировки всей базы по алфавиту, этот адрес и телефон по прежнему соответствовали этому названию.
Реально ли сделать подобное во флеше - или стоит писать программу, которая будет сортировать по названию сам XML?

wvxvw
29.07.2009, 15:50
Вы можете написать как выглядят исходные данные и что вы в итоге хотите получить?...
Мне не понятно откуда взялись undefined.
И PEUGEOT пишется с E :)

varvaray
29.07.2009, 16:05
Итак, есть XML приблизительно такого вида:


<elux>
<!-- таблица object -->
<object>
<object_id>1</object_id>
<object_type>shop</object_type>
<object_name>Орхидея</object_name>
<object_address>ул. Марата, 7</object_address>
<object_tel>3335676</object_tel>
<object_services>доставка цветов, составление букетов, оформление и декорация помещений</object_services>
<object_url>http://www.orhideja.ru</object_url>
<object_piс>logo/3.gif</object_piс>
<object_map_id>1</object_map_id>
<object_map_x>1000</object_map_x>
<object_map_y>1000</object_map_y>
<object_info>Сейчас нам предстоит самая сложная задача в этом проекте — реализовать функцию-мозг, которая будет решать, в какую клетку нужно сделать ход. Первым шагом, который мы осуществим в этом направлении, станет создание переменных, хранящих маршрут обхода рядков для каждой клетки. Как вы помните, необходимо сделать оценку ценности позиции клетки относительно всех рядков, к которым она относится, а вывод сделать по их сумме. Конечно, можно попытаться написать и универсальный алгоритм, который сможет обходить все рядки, к которым принадлежит клетка, вне зависимости от ее положения. Но это слишком сложно для крестиков-ноликов и достойно скорее игры «Пять в ряд». Гораздо проще и быстрее будет перечислить в индивидуальной для каждой клетки переменной индексы клеток, образующих рядки, к которым она относится:</object_info>
<object_foto1>foto/1.jpg</object_foto1>
<object_foto2>foto/2.jpg</object_foto2>
<object_foto3>foto/3.jpg</object_foto3>
<object_time>с 10 до 18-30</object_time>
</object>
<object>
<object_id>2</object_id>
<object_type>shop</object_type>
<object_name>Модница</object_name>
<object_address>ул. Науки, 5</object_address>
<object_tel>2340900</object_tel>
<object_services>сумки из Италии</object_services>
<object_url>http://www.italy.ru</object_url>
<object_piс>logo/3.gif</object_piс>
<object_map_id>2</object_map_id>
<object_map_x>390</object_map_x>
<object_map_y>700</object_map_y>
<object_info>Станции превратились в города-государства, а в туннелях властвуют тьма и страх. Жители Севастопольской, маленькой подземной Спарты, ценой невероятных
усилий выживают на своей станции и обороняют ее. Но однажды Севастопольская оказывается отрезанной от большого метро, всем ее обитателям грозит страшная гибель. Чтобы спасти людей, нужен настоящий герой…
</object_info>
<object_foto1>foto/4.jpg</object_foto1>
<object_foto2>foto/5.jpg</object_foto2>
<object_foto3>foto/6.jpg</object_foto3>
<object_time>с 10 до 19</object_time>
</object>
...


Есть кнопки с алфавитом - русским и английским(по 2-3 буквы на кнопку). При нажатии на кнопку на сцене отображаются все объекты, с названием, начинающимся на соответствующую букву. Проблема в том, что они отображаются в том порядке, в котором записаны в XML. Т.е. не происходит сортировки по алфавиту - простая выборка, и названия на Б оказываются раньше названий на А, если в XML они встречаются раньше.

Внизу привожу кусок кода, который отвечает за выборку. Сначала выборка по "типу". Если язык не выбран - подгружаются все объекты, если русский или английский - то по буквам.
Необходимо, чтобы на экране все было по алфавиту


for (var i = 0; i < elux.firstChild.childNodes.length; i++)
{

var i_name = new Array ();
i_name[i] = o_name[i].split ("");

if (o_type[i] == "avto")
{
if (ru_eng == "all")
{
otrisovka(o_name[i],o_address[i],o_tel[i],o_services[i],o_info[i],o_foto1[i],o_foto2[i],o_foto3[i],o_pic[i],o_time[i],o_url[i]);
}
else if (ru_eng == "rus")
{
if ((i_name[i][0] == t1) or (i_name[i][0] == t2) or (i_name[i][0] == t3))
{
trace (o_name[i]);
otrisovka(o_name[i],o_address[i],o_tel[i],o_services[i],o_info[i],o_foto1[i],o_foto2[i],o_foto3[i],o_pic[i],o_time[i],o_url[i]);
}
else
{
//trace("NO " + i_name[i][0]);
}
}
else if (ru_eng = "eng")
{
if ((i_name[i][0] == r1) or (i_name[i][0] == r2))
{
trace (o_name[i]);
otrisovka(o_name[i],o_address[i],o_tel[i],o_services[i],o_info[i],o_foto1[i],o_foto2[i],o_foto3[i],o_pic[i],o_time[i],o_url[i]);
}
else
{
}
}
else
{
}
}
else
{
}
}




Эм... Хорошо, что вы не видите, что я там, бывает, в инфо пишу... Базы как таковой еще нет, а искать реальную информацию лениво :)

Добавлено через 4 минуты
Если не знаешь, как делать в принципе - читаешь литературу, копаешься на форумах - и узнаешь. Учиться, бывает, интересно...

Mnilionic
30.07.2009, 21:23
реально:

var xml:XML = new XML();
xml.ignoreWhite = true;
xml.onLoad = function(flag:Boolean){
if(!flag){ trace('no such file'); return; }
convert();
// поле по которому сортируем
sorting('object_name', false);
}
xml.load('your.xml');

var data = new Array();
function convert(){
var box= xml.firstChild.firstChild;
while(box){
var item:Object = new Object();
var prop = box.firstChild;
while(prop){
item[prop.nodeName] = prop.firstChild.nodeValue;
prop = prop.nextSibling;
}
data.push(item);
box = box.nextSibling;
}
}

function sorting(field:String, desc:Boolean){
test_trace()
if(desc)
data.sortOn([field], Array.DESCENDING );
else
data.sortOn([field]);
test_trace()
}

// тустовый вывод
function test_trace(){
trace( data[0].object_id+ '| ' +data[0].object_name);
trace( data[1].object_id+ '| ' +data[1].object_name);
trace( '--------');
}



но лучше, конечно, большие данные подготвливать в другой среде